如何在Javascript中高效地合并两个数组?

如何在Javascript中高效地合并两个数组?,javascript,jquery,arrays,object,Javascript,Jquery,Arrays,Object,假设我有两个Javascript对象数组: var myList = [{id: 3, info: 'bla'}, {id: 97, info: 'ble'}, {id: 25, info: 'blu'}]; var newList = [{id: 5, info: 'blo'}, {id: 3, info: 'different Info!!'}]; 我现在想将新列表合并到myList,意思是: myList中已存在id的所有对象都应替换为newList 所有id不在myList中的对象都

假设我有两个Javascript对象数组:

var myList = [{id: 3, info: 'bla'}, {id: 97, info: 'ble'}, {id: 25, info: 'blu'}];
var newList = [{id: 5, info: 'blo'}, {id: 3, info: 'different Info!!'}];
我现在想将
新列表
合并到
myList
,意思是:

  • myList
    中已存在id的所有对象都应替换为
    newList
  • 所有id不在
    myList
    中的对象都应该从
    newList
    添加到
    myList
但是,我不明白如何检查数组中是否已经存在具有特定id的对象。我想您可以对newList中的每一项在myList上进行循环,但这不是很容易扩展的


有人知道我怎样才能有效地做到这一点吗?欢迎所有提示

很抱歉,您需要做一些比较来比较您的身份证。 您可以对第一个对象数组执行一次迭代,以获得每个元素的ID属性。在此迭代中,您可以对合并数组执行另一次迭代,比较值,并将所需值推送到新的“结果”数组中

也许这可以帮助您使用嵌套的代码保持代码整洁:


希望这有所帮助。

您可以使用对象来确保ID是唯一的,这将自动覆盖现有ID,然后将其转换回数组

var myList=[{id:5,info:'bla'},{id:97,info:'ble'},{id:25,info:'blu'}];
var newList=[{id:5,info:'blo'},{id:3,info:'different info!!'}];
var o={};
var newArr=[];
myList.forEach(函数(x){
o[x.id]=x;
});
forEach(函数(x){
o[x.id]=x;
});
for(变量输入o){
新建推送(o[键])
}

document.body.innerHTML=''+JSON.stringify(newArr,null,4)+''
您可以在
newList
中循环检查
myList
中是否有具有该id的对象。如果有,请使用
splice
将旧对象替换为新对象,否则将新对象推入
myList

function combineArray(array1, array2) {
    var arr = array1.concat(array2);

    for(var i = 0; i < arr.length; ++i) {
        for(var j = i + 1; j < arr.length; ++j) {
            if(arr[i].id === arr[j].id)
                arr.splice(i, 1);
        }
    }

    return arr;
};
var myList=[{id:3,info:'bla'},{id:97,info:'ble'},{id:25,info:'blu'}];
var newList=[{id:5,info:'blo'},{id:3,info:'different info!!'}];
newList.forEach(函数(el){
var found=myList.filter(函数(obj){
返回obj.id==el.id;
});
如果(找到。长度){
myList.splice(myList.indexOf(发现[0]),1,el);
}
否则{
myList.push(el);
}
});
警报(JSON.stringify(myList,null,“\t”)尝试:

返回


[Object{id=97,info=“ble”},Object{id=25,info=“blu”},Object{id=5,info=“blo”},Object{id=3,info=“different info!!”}]
您可以使用
数组.prototype.concat()
数组.prototype.filter()
方法来实现这一点


在使用标志创建数组时跟踪它-否则必须在其中一个数组上执行初始循环,并使用id作为键创建新对象;)我想这个链接可能会对你有所帮助
combineArray([{id: 3, info: 'bla'}, {id: 97, info: 'ble'}, {id: 25, info: 'blu'}], [{id: 5, info: 'blo'}, {id: 3, info: 'different Info!!'}] );
var myList = [{id: 3, info: 'bla'}, {id: 97, info: 'ble'}, {id: 25, info: 'blu'}];
var newList = [{id: 5, info: 'blo'}, {id: 3, info: 'different Info!!'}];
var temp = {};
var output = newList.concat(myList).filter(function(v){
    if (temp[v.id]){
        return false;
    }
    temp[v.id] = true;
    return true;
});

console.log(output);