2016-05-05 420 views
2

我想更新(替換)我的數組中的對象與另一個數組中的對象。每個對象具有相同的結構。例如JavaScript - 合併兩個對象數組並根據屬性值去重複

var origArr = [ 
    {name: 'Trump', isRunning: true}, 
    {name: 'Cruz', isRunning: true}, 
    {name: 'Kasich', isRunning: true} 
]; 
var updatingArr = [ 
    {name: 'Cruz', isRunning: false}, 
    {name: 'Kasich', isRunning: false} 
]; 
// desired result: 
NEWArr = [ 
    {name: 'Trump', isRunning: true}, 
    {name: 'Cruz', isRunning: false}, 
    {name: 'Kasich', isRunning: false} 
]; 

我試過CONCAT()&下劃線的_.uniq功能,但它總是轉儲新對象&回報,從本質上講,原來的陣列。

有沒有辦法用updatingArr中的對象覆蓋(替換)origArr - 匹配name屬性?

+1

這就是你是什麼意思? https://jsfiddle.net/4p98w3su/不知道我明白了這個問題。 – spaceman

+0

這裏所有的好答案;我喜歡你最好的,使用拼接。如果您想將其轉換爲答案,我會將其標記爲已接受。謝謝。 –

+0

我把它作爲答案,我認爲它也比涉及map&reduce的方法更快。在一段時間內運行數百萬次後,我的速度提高了兩倍。 – spaceman

回答

3

使用雙for循環和拼接,你可以做到這一點,像這樣:

for(var i = 0, l = origArr.length; i < l; i++) { 
    for(var j = 0, ll = updatingArr.length; j < ll; j++) { 
     if(origArr[i].name === updatingArr[j].name) { 
      origArr.splice(i, 1, updatingArr[j]); 
      break; 
     } 
    } 
} 

here

1

這將你需要的東西:

var origArr = [ 
 
    {name: 'Trump', isRunning: true}, 
 
    {name: 'Cruz', isRunning: true}, 
 
    {name: 'Kasich', isRunning: true} 
 
]; 
 

 
var updatingArr = [ 
 
    {name: 'Cruz', isRunning: false}, 
 
    {name: 'Kasich', isRunning: false} 
 
]; 
 

 
for (var i = 0; i < updatingArr.length; ++i) { 
 
    var updateItem = updatingArr[i]; 
 
    for (var j = 0; j < origArr.length; ++j) { 
 
    var origItem = origArr[j]; 
 
    if (origItem.name == updateItem.name) { 
 
     origItem.isRunning = updateItem.isRunning; 
 
     break;  
 
    } 
 
    } 
 
} 
 

 
document.write('<pre>' + JSON.stringify(origArr, 0, 4) + '</pre>');

2

你可以結合使用Array#mapArray#reduce

var origArr = [{ name: 'Trump', isRunning: true }, { name: 'Cruz', isRunning: true }, { name: 'Kasich', isRunning: true }], 
 
    updatingArr = [{ name: 'Cruz', isRunning: false }, { name: 'Kasich', isRunning: false }], 
 
    NEWArr = origArr.map(function (a) { 
 
     return this[a.name] || a; 
 
    }, updatingArr.reduce(function (r, a) { 
 
     r[a.name] = a; 
 
     return r; 
 
    }, Object.create(null))); 
 

 
document.write('<pre>' + JSON.stringify(NEWArr, 0, 4) + '</pre>');

2

您可以使用散列給出索引的名稱,並Object.assign進行更新。

var hash = origArr.reduce(function(hash, obj, index) { 
    hash[obj.name] = index; 
    return hash; 
}, Object.create(null)); 
for(var obj of updatingArr) { 
    Object.assign(origArr[hash[obj.name]], obj); 
} 
2

您可以試試這個。

var origArr = [ 
    {name: 'Trump', isRunning: true}, 
    {name: 'Cruz', isRunning: true}, 
    {name: 'Kasich', isRunning: true} 
]; 
var updatingArr = [ 
    {name: 'Cruz', isRunning: false}, 
    {name: 'Kasich', isRunning: false} 
]; 

var origLength = origArr.length; 
var updatingLength = updatingArr.length; 

//Traverse the original array and replace only if the second array also has the same value 
for(i = origLength-1; i >= 0; i--) { 
    for(j = updatingLength -1; j >= 0; j--) { 
    if(origArr[i].name === updatingArr[j].name) { 
     origArr[i] = updatingArr[j]; 
    } 
    } 
} 

console.log(origArr); 
+0

遍歷按照相反的順序完成,因爲根據jspref進行的測試,耗時最少 –

2

下面是使用下劃線的解決方案:

var result = _.map(origArr, function(orig){ 
    return _.extend(orig, _.findWhere(updatingArr, {name: orig.name})); 
}); 
相關問題