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"}
] }
以下是需要考虑的事项:
$.extend()
替换对象,$.merge()
不会删除重复项(我知道我可以为循环执行,但我正在寻找更好的方法来执行此操作)。
答案 0 :(得分:14)
您可以使用$.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;
});
答案 1 :(得分:3)
这是一个直接的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;
};
带有复杂对象的
答案 2 :(得分:1)
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);
答案 3 :(得分:0)
合并两个对象数组以删除重复项
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"}
]}
let obj3 = [...obj1.data, ...obj2.data]
function mergeUniqueArray(arr, comp) {
let unique = arr
.map(item => item[comp])
// store the keys of the unique objects
.map((item, i, final) => final.indexOf(item) === i && i)
// eliminate the duplicate keys & store unique objects
.filter(item => arr[item]).map(item => arr[item]);
return unique;
}
console.log(mergeUniqueArray(obj3,'id'));