2015-12-03 71 views
1

說我有對象的兩個數組,像這樣:合併兩個數組的相同索引對象

var arr1 = [{name: 'Jay'}, {name: 'Bob'}]; 
var arr2 = [{age: 22}, {age: 30}]; 

我想經組合的陣列,像這樣:

var arr3 = [{name: 'jay', age: 22}, {name: 'Bob', age: 30}]; 

您可以安全地假定兩個初始數組將具有彼此匹配的索引,這意味着arr1的索引0將始終與arr2的索引0一起進行。

什麼是完成這一任務的最快的方法?我想象一個forEach循環嵌套在另一個forEach循環,並從arr1與當前對象從arr2延伸的每個對象,但我覺得這可能是過於複雜。

回答

5

你可以只遍歷一個數組,並使用從第一次迭代索引的新數組。有很多方法可以做到這一點。這裏有一個:

var arr1 = [{name: 'Jay'}, {name: 'Bob'}]; 
 
    var arr2 = [{age: 22}, {age: 30}]; 
 

 
    var combined = arr1.map(function(item, index) { 
 
     return {name: item.name, age: arr2[index].age}; 
 
    }); 
 
    document.write(JSON.stringify(combined));

如果你真的想最大的性能,你必須測試在許多不同的瀏覽器的多項計劃。例如,在某些瀏覽器中,有時for循環比內置數組方法更快。

var arr1 = [{name: 'Jay'}, {name: 'Bob'}]; 
 
var arr2 = [{age: 22}, {age: 30}]; 
 
var combined = []; 
 

 
for (var i = 0; i < arr1.length; i++) { 
 
    combined[i] = {name: arr1[i].name, age: arr2[i].age}; 
 
} 
 

 
document.write(JSON.stringify(combined));

僅供參考,for循環選項(第二個選項)看起來在這裏a jsperf所有三種瀏覽器相當快一點。

enter image description here

+0

超。我將它添加到我的圖書館。 –

+0

真棒,非常感謝,這是完美的。很好很簡單。 – la1ch3

+3

增加了jsperf參考和屏幕截圖。 – jfriend00

0

最平凡解是(在比較任何util的LIB像underscore.js或類似的)。它的優點是它沒有任何依賴性。

var result = []; 
for(var i = 0; i < arr1.length; i+= 1) { 
    item = {}; 
    item.name = arr1[i].name; 
    item.age = arr2[i].age; 
    result.push(item); 
} 
0

在for循環:

var arr1 = [{name: 'Jay'}, {name: 'Bob'}]; 
 
var arr2 = [{age: 22}, {age: 30}]; 
 

 

 
for(var i in arr1) 
 
{ 
 
    arr1[i]['age'] = arr2[i]['age']; 
 
} 
 

 
console.log(arr1) //[Object { name="Jay", age=22}, Object { name="Bob", age=30}]

現在你有合併結果ARR1。

0

更鬆散耦合的解決方案將使用lodash庫的merge功能。

這將與您在對象中具有的鍵和鍵名稱的數量無關。所以在未來,如果您決定將鍵添加到對象中,則不需要更新代碼來合併對象。

var _ = require('lodash'); 

var arr1 = [{name: 'Jay'}, {name: 'Bob'}]; 
var arr2 = [{age: 22}, {age: 30}]; 
var arr3 = []; 

for (var i=0; i<arr1.length; i++) { 
    arr3.push(_.merge(arr1[i], arr2[i])); 
} 

console.log(arr3); 
相關問題