73

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' ...}]
8
  • its dynamic. so I cant use index. I need a function which can merge n number of objects into final object. Commented Apr 30, 2012 at 13:53
  • 6
    Those aren't JSON objects, just arrays. Commented Apr 30, 2012 at 13:54
  • @MurtazaHussain If your code is like shown above, my comment is right. Commented Apr 30, 2012 at 13:55
  • @Quentin [ { "id": 1, "name": 6 } ] is normal json for example Commented Apr 30, 2012 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). Commented Apr 30, 2012 at 13:58

10 Answers 10

123

You want the concat method.

var finalObj = json1.concat(json2);
Sign up to request clarification or add additional context in comments.

1 Comment

@kushdilip — json1 and json2 are arrays! (Each has one member, which is an object)
39

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

4 Comments

What is the benefit of jquery here? I think using concat directly is right choice.
@Vojta As is explained to begin with. I simply showed how to extend jQuery to include the method.
you can also write var finalObj = [].concat(json1, json2, json3, json4, json5, ....); in this case
jQuery provides no value here.
22

You could try merge

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

Comments

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.

Comments

5

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' } ]

2 Comments

I think it is doing the intersection instead of Union.
No its doing union 2ality.com/2015/01/es6-set-operations.html you can check this linl
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)

Comments

1

Maybe, you can use the array syntax of javascript :

var finalObj =[json1 , json2]

1 Comment

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. :)
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/[email protected]/lodash.min.js"></script>

Comments

-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)))

1 Comment

He needed to merge arrays of objects, your answer does not do that, could you elaborate/modify it ?
-4
var json1=["Chennai","Bangalore"];
var json2=["TamilNadu","Karanataka"];

finaljson=json1.concat(json2);

1 Comment

If you want to offer Thanks on a post you can click the up arrow next to it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.