将两个JSON/JavaScript数组合并成一个数组

72

我有两个 JSON 数组,类似于:

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
6
那些不是 JSON 对象,只是数组。 - Quentin
如果你的代码像上面展示的那样,我的评论就是正确的。 - user1150525
@Quentin [ { "id": 1, "name": 6 } ] 是一个正常的 JSON 示例。 - Royi Namir
2
@Royi Namir — 不,你可以将数组序列化为JSON,但那只是一个数组。(数组内部对象的语法也不符合JSON标准)。 - Quentin
显示剩余3条评论
10个回答

123
你需要使用 concat 方法。
var finalObj = json1.concat(json2);

4
@kushdilipиҜҙзҡ„жҳҜjson1е’Ңjson2йғҪжҳҜж•°з»„пјҒпјҲжҜҸдёӘж•°з»„еҸӘжңүдёҖдёӘжҲҗе‘ҳпјҢиҜҘжҲҗе‘ҳжҳҜдёҖдёӘеҜ№иұЎпјү - Quentin

38

初看,“merg”一词似乎需要使用.extend,这是正确的jQuery方法来“合并”JSON对象。然而,$.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 是正确的选择。 - Vojta
1
@Vojta 如开头所解释的那样。我只是展示了如何扩展jQuery以包括这个方法。 - SpYk3HH
3
在这种情况下,您还可以编写var finalObj = [].concat(json1, json2, json3, json4, json5, ....); - Vojta
1
jQuery在这里没有任何价值。 - TimTheEnchanter

22

你可以尝试使用合并函数

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

6

5
你可以使用ES6的新特性来做到这一点:
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
不是在执行联合操作,你可以查看这个链接:http://2ality.com/2015/01/es6-set-operations.html - Hoque MD Zahidul

2
如果使用ES6,您可以使用新的JS扩展运算符:

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

console.log(finalObj)


1
也许,您可以使用 JavaScript 的数组语法:
var finalObj =[json1 , json2]

完美运作。谢谢。不知何故,我的concat不再起作用了,尽管它已经运行了两年。但是这个替代方案却可以工作。世界真疯狂。 :) - 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>


-1

尝试使用jQuery extend方法下面的代码:

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

如果您想在帖子上表示感谢,可以点击其旁边的向上箭头。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接