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

时间:2014-11-26 10:56:54

标签: 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!!'}];

我现在想要"合并"将newList转换为myList,意思是:

  • myList中已存在ID的所有对象应替换为newList中的对象
  • myList中不存在ID的所有对象应从newList添加到myList

但是我不明白,我如何检查具有特定id的对象是否已经在数组中。我想你可以为newList中的每个项目对myList进行循环,但这不是很可扩展。

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

5 个答案:

答案 0 :(得分:1)

您可以使用对象来确保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(function(x) {
    o[x.id] = x;
});
    
newList.forEach(function(x) {
    o[x.id] = x;
});
    
for (var key in o) {
    newArr.push(o[key])
}

document.body.innerHTML = '<pre>' + JSON.stringify(newArr, null, 4) + '</pre>';
&#13;
&#13;
&#13;

答案 1 :(得分:1)

尝试:

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

然后

combineArray([{id: 3, info: 'bla'}, {id: 97, info: 'ble'}, {id: 25, info: 'blu'}], [{id: 5, info: 'blo'}, {id: 3, info: 'different Info!!'}] );

返回

[Object { id=97, info="ble"}, Object { id=25, info="blu"}, Object { id=5, info="blo"}, Object { id=3, info="different Info!!"}]

答案 2 :(得分:0)

我很遗憾地说,你必须做一些比较来比较你的ID。 您可以对第一个对象数组进行迭代,以获取每个元素的ID属性。在这个itteration中,您可以在合并数组上进行另一次迭代,比较值并将您想要的值推送到新的&#34;结果&#34;阵列。

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

Find a value in an array of objects in Javascript

希望这会有所帮助。

答案 3 :(得分:0)

如果newList包含具有此ID的对象,您可以循环检查myList。如果是,请使用splice替换新旧对象,否则将新对象推送到myList

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(function(el) {

    var found = myList.filter(function(obj) {
        return obj.id == el.id;
    });

    if (found.length) {
        myList.splice(myList.indexOf(found[0]), 1, el);
    }
    else {
        myList.push(el);
    }
});

alert( JSON.stringify(myList, null, '\t') );

答案 4 :(得分:0)

您可以使用array.prototype.concat()array.prototype.filter()方法进行此操作..

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