如何合并两个JSON对象数组 – 删除重复项并保留Javascript / jQuery中的顺序?

jsfiddle链接: http : //jsfiddle.net/vN6fn/1/

假设我有这两个对象:

var obj1 = { data: [ {id:1, comment:"comment1"}, {id:2, comment:"comment2"}, {id:3, comment:"comment3"} ] } var obj2 = { data: [ {id:2, comment:"comment2"}, {id:3, comment:"comment3"}, {id:4, comment:"comment4"} ] } 

最终对象应如下所示:

 var final = { data: [ {id:1, comment:"comment1"}, {id:2, comment:"comment2"}, {id:3, comment:"comment3"}, {id:4, comment:"comment4"} ] } 

这里有一些要考虑的事情:

  • obj1和obj2可能有也可能没有重复

$.extend()替换对象, $.merge()不会删除重复项(我知道我可以为循环执行,但我正在寻找更好的方法来执行此操作)。

您可以使用$.merge然后浏览并删除重复项,然后对其进行排序。

 $.merge(obj1.data, obj2.data); var existingIDs = []; obj1.data = $.grep(obj1.data, function(v) { if ($.inArray(v.id, existingIDs) !== -1) { return false; } else { existingIDs.push(v.id); return true; } }); obj1.data.sort(function(a, b) { var akey = a.id, bkey = b.id; if(akey > bkey) return 1; if(akey < bkey) return -1; return 0; }); 

这是一个直接的jQuery解决方案:

 function mergeDeep(o1, o2) { var tempNewObj = o1; //if o1 is an object - {} if (o1.length === undefined && typeof o1 !== "number") { $.each(o2, function(key, value) { if (o1[key] === undefined) { tempNewObj[key] = value; } else { tempNewObj[key] = mergeDeep(o1[key], o2[key]); } }); } //else if o1 is an array - [] else if (o1.length > 0 && typeof o1 !== "string") { $.each(o2, function(index) { if (JSON.stringify(o1).indexOf(JSON.stringify(o2[index])) === -1) { tempNewObj.push(o2[index]); } }); } //handling other types like string or number else { //taking value from the second object o2 //could be modified to keep o1 value with tempNewObj = o1; tempNewObj = o2; } return tempNewObj; }; 

演示复杂的对象。 我把它变成了一个博客post,显示了jQuery的.extend()和我的脚本之间的区别。

http://jsfiddle.net/J9EpT/

 function merge(one, two){ if (!one.data) return {data:two.data}; if (!two.data) return {data:one.data}; var final = {data:one.data}; // merge for(var i = 0 ; i < two.data.length;i++){ var item = two.data[i]; insert(item, final); } return final; } function insert(item, obj){ var data = obj.data; var insertIndex = data.length; for(var i = 0; i < data.length; i++){ if(item.id == data[i].id){ // ignore duplicates insertIndex = -1; break; } else if(item.id < data[i].id){ insertIndex = i; break; } } if(insertIndex == data.length){ data.push(item); } else if(insertIndex != -1) { data.splice(insertIndex,0,item); } } var final = merge(obj1, obj2);