72

I have two json arrays like

var json1 = [{id:1, name: 'xxx' ...}]
var json2 = [{id:2, name: 'xyz' ...}]

I want them merge in to single arrays

var finalObj = [{id:1, name: 'xxx' ...},{id:2, name: 'xyz' ...}]
StarSweeper
  • 397
  • 2
  • 4
  • 28
Murtaza Khursheed Hussain
  • 15,176
  • 7
  • 58
  • 83
  • its dynamic. so I cant use index. I need a function which can merge n number of objects into final object. – Murtaza Khursheed Hussain Apr 30 '12 at 13:53
  • 6
    Those aren't JSON objects, just arrays. – Quentin Apr 30 '12 at 13:54
  • @MurtazaHussain If your code is like shown above, my comment is right. –  Apr 30 '12 at 13:55
  • @Quentin `[ { "id": 1, "name": 6 } ]` is normal json for example – Royi Namir Apr 30 '12 at 13:56
  • 2
    @Royi Namir — No, you could serialise an array to JSON, but that is just an array. (The syntax of the objects inside the array don't conform to the JSON standard anyway). – Quentin Apr 30 '12 at 13:58
  • @Quentin its just an array - yes. but the example I gave ( the array) is json ( not json string representation) ! try it with jsonlint.com - i didnt say his array is valid. but my example for array - is perfectlly fine. – Royi Namir Apr 30 '12 at 14:00
  • @RoyiNamir — I'm talking about the question, which contains JavaScript code and no JSON. The fact that JSON *can* have an array as its outer-most data structure is irrelevant. – Quentin Apr 30 '12 at 14:02
  • @Quentin youve answered `no` to my `array is ( also) json object`. thats why i replied. we agree than. – Royi Namir Apr 30 '12 at 14:04

10 Answers10

123

You want the concat method.

var finalObj = json1.concat(json2);
Quentin
  • 914,110
  • 126
  • 1,211
  • 1,335
38

Upon first appearance, the word "merg" leads one to think you need to use .extend, which is the proper jQuery way to "merge" JSON objects. However, $.extend(true, {}, json1, json2); will cause all values sharing the same key name to be overridden by the latest supplied in the params. As review of your question shows, this is undesired.

What you seek is a simple javascript function known as .concat. Which would work like:

var finalObj = json1.concat(json2);

While this is not a native jQuery function, you could easily add it to the jQuery library for simple future use as follows:

;(function($) {
    if (!$.concat) {
        $.extend({
            concat: function() {
                return Array.prototype.concat.apply([], arguments);
            }
        });
    }
})(jQuery);

And then recall it as desired like:

var finalObj = $.concat(json1, json2);

You can also use it for multiple array objects of this type with a like:

var finalObj = $.concat(json1, json2, json3, json4, json5, ....);

And if you really want it jQuery style and very short and sweet (aka minified)

;(function(a){a.concat||a.extend({concat:function(){return Array.prototype.concat.apply([],arguments);}})})(jQuery);

;(function($){$.concat||$.extend({concat:function(){return Array.prototype.concat.apply([],arguments);}})})(jQuery);

$(function() {
    var json1 = [{id:1, name: 'xxx'}],
        json2 = [{id:2, name: 'xyz'}],
        json3 = [{id:3, name: 'xyy'}],
        json4 = [{id:4, name: 'xzy'}],
        json5 = [{id:5, name: 'zxy'}];
    
    console.log(Array(10).join('-')+'(json1, json2, json3)'+Array(10).join('-'));
    console.log($.concat(json1, json2, json3));
    console.log(Array(10).join('-')+'(json1, json2, json3, json4, json5)'+Array(10).join('-'));
    console.log($.concat(json1, json2, json3, json4, json5));
    console.log(Array(10).join('-')+'(json4, json1, json2, json5)'+Array(10).join('-'));
    console.log($.concat(json4, json1, json2, json5));
});
center { padding: 3em; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<center>See Console Log</center>

jsFiddle

SpYk3HH
  • 22,272
  • 11
  • 70
  • 81
22

You could try merge

var finalObj = $.merge(json1, json2);
izb
  • 50,101
  • 39
  • 117
  • 168
6

Since you are using jQuery. How about the jQuery.extend() method?

http://api.jquery.com/jQuery.extend/

Description: Merge the contents of two or more objects together into the first object.

Kris Krause
  • 7,304
  • 2
  • 23
  • 26
4

You can do this using Es 6 new feature :

var json1 = [{id:1, name: 'xxx' , ocupation : 'Doctor' }];

var json2 = [{id:2, name: 'xyz' ,ocupation : 'SE'}];

var combineJsonArray = [...json1 , ...json2];

//output should like this [ { id: 1, name: 'xxx', ocupation: 'Doctor' },
  { id: 2, name: 'xyz', ocupation: 'SE' } ]

Or You can put extra string or anything between two json array :

var json3 = [...json1 ,"test", ...json2];

// output should like this : [ { id: 1, name: 'xxx', ocupation: 'Doctor' },
  'test',
  { id: 2, name: 'xyz', ocupation: 'SE' } ]
Hoque MD Zahidul
  • 10,560
  • 2
  • 37
  • 40
2

You can use the new js spread operator if using es6:

var json1 = [{id:1, name: 'xxx'}]
var json2 = [{id:2, name: 'xyz'}]
var finalObj = [...json1, ...json2]

console.log(finalObj)
Mailyan
  • 195
  • 1
  • 4
1

Maybe, you can use the array syntax of javascript :

var finalObj =[json1 , json2]
Jérôme B
  • 420
  • 1
  • 6
  • 25
  • Works perfectly. Thank you. Somehow concat is not working for me anymore though it works for about 2 years. But this one here instead works. Crazy world. :) – kwoxer Jun 15 '16 at 21:01
0

You can achieve this using Lodash _.merge function.

var json1 = [{id:1, name: 'xxx'}];
var json2 = [{id:2, name: 'xyz'}];
var merged = _.merge(_.keyBy(json1, 'id'), _.keyBy(json2, 'id'));
var finalObj = _.values(merged);

console.log(finalObj);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>
Penny Liu
  • 15,447
  • 5
  • 79
  • 98
-1

Try the code below, using jQuery extend method:

var json1 = {"name":"ramesh","age":"12"};

var json2 = {"member":"true"};

document.write(JSON.stringify($.extend(true,{},json1,json2)))
tbraun89
  • 2,246
  • 3
  • 25
  • 44
  • 3
    He needed to merge **arrays** of objects, your answer does not do that, could you elaborate/modify it ? – Gar Jul 14 '16 at 08:55
-4
var json1=["Chennai","Bangalore"];
var json2=["TamilNadu","Karanataka"];

finaljson=json1.concat(json2);
Krsna Kishore
  • 8,233
  • 4
  • 32
  • 48
Vinoth Smart
  • 383
  • 3
  • 13