将两个json / javascript数组合并为一个数组


69

我有两个像

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

我希望它们合并成单个数组

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

它的动态。所以我不能使用索引。我需要一个可以将n个对象合并为最终对象的函数。
Murtaza Khursheed Hussain 2012年

6
这些不是JSON对象,只是数组。
昆汀

@MurtazaHussain如果您的代码如上所示,我的评论是正确的。

[ { "id": 1, "name": 6 } ]例如,@ Quentin是普通的json
Royi Namir

2
@Royi Namir —不,您可以将数组序列化为JSON,但这只是一个数组。(无论如何,数组内部对象的语法都不符合JSON标准)。
昆汀

Answers:


117

您需要该concat方法。

var finalObj = json1.concat(json2);

4
@kushdilip -json1并且json2 阵列!(每个成员都有一个成员,这是一个对象)
Quentin

37

首次出现时,单词“ merg”使您认为您需要使用.extend,这是“合并” JSON对象的正确jQuery方法。但是,这$.extend(true, {}, json1, json2);将导致共享相同键名的所有值被参数中提供的最新值覆盖。正如您对问题的评论所示,这是不希望的。

您想要的是一个简单的JavaScript函数,称为.concat。像这样工作:

var finalObj = json1.concat(json2);

虽然这不是jQuery的本机功能,但您可以轻松地将其添加到jQuery库中,以供将来简单使用,如下所示:

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

然后根据需要调用它,例如:

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

您还可以将其用于类似这种类型的多个数组对象:

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

而且,如果您真的想要jQuery样式,而且又简短又甜美(又名小巧)

;(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


2
jQuery在这里有什么好处?我认为concat直接使用是正确的选择。
福伊塔2015年

1
@Vojta正如开始所解释的。我只是简单地展示了如何扩展jQuery以包括该方法。
SpYk3HH 2015年

3
您也可以var finalObj = [].concat(json1, json2, json3, json4, json5, ....);在这种情况下写
Vojta,2015年

1
jQuery在这里没有任何价值。
TimTheEnchanter

21

您可以尝试合并

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


2

您可以使用Es 6的新功能来做到这一点:

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

或者,您可以在两个json数组之间放置额外的字符串或其他内容:

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

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

我认为它是在做交集而不是联合。
Murtaza Khursheed Hussain '10 / 10/24

没有做任何事情2ality.com/2015/01/es6-set-operations.html您可以检查此linl
Hoque MD Zahidul

1

也许您可以使用javascript的数组语法:

var finalObj =[json1 , json2]

完美运作。谢谢。尽管concat可以工作约2年,但以某种方式不再对我有用。但是这里的这个代替了。疯狂的世界。:)
kwoxer

0

您可以使用Lodash _.merge函数来实现。

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>


0

如果使用es6,则可以使用新的js传播运算符:

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

console.log(finalObj)


-1

使用jQuery扩展方法尝试以下代码:

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

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

document.write(JSON.stringify($.extend(true,{},json1,json2)))

3
他需要合并对象数组,您的答案没有做到这一点,您能否详细说明/修改它?
Gar

-4
var json1=["Chennai","Bangalore"];
var json2=["TamilNadu","Karanataka"];

finaljson=json1.concat(json2);

如果您想在帖子中提供“谢谢”,则可以单击其旁边的向上箭头。
昆汀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.