簡體   English   中英

如何在Javascript中有效地合並兩個數組?

[英]How to efficiently merge two arrays in Javascript?

假設我在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進行循環,但這不是很可擴展。

有誰知道我怎樣才能有效地做到這一點? 歡迎所有提示!

您可以使用一個對象來確保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>'; 

嘗試:

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!!"}]

我很遺憾地說,你必須做一些比較來比較你的身份證。 您可以對第一個對象數組進行迭代,以獲取每個元素的ID屬性。 在這個itteration中,您可以在合並數組上進行另一次迭代,比較值並將您想要的值推送到新的“result”數組。

也許這可以幫助您使用嵌套的itterations保持代碼整潔:

在Javascript中查找對象數組中的值

希望這有幫助。

你可以遍歷newList檢查,如果myList有這樣的ID的對象。 如果是,請用新的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') ); 

你可以使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM