2016-03-22 98 views
4

我一直在試圖弄清楚這一點,很長一段時間,如果我有對象的這樣一個數組:合併使用相同的密鑰JavaScript中的對象

var my_array = [ 
    Object {Project: A, Hours: 2}, 
    Object {Project: B, Hours: 3}, 
    Object {Project: C, Hours: 5}, 
    Object {Project: A, Hours: 6}, 
    Object {Project: C, Hours: 9} 
] 

我要合併所有具有相同的對象一起鑰匙插入一個對象,使得它們獲得時間加起來:

預期輸出:

my_array = [ 
    Object {Project: A, Hours: 8} 
    Object {Project: B, Hours: 3} 
    Object {Project: C, Hours: 14} 
] 

我如何處理這個問題?我花了很長時間以這種方式獲取數據格式,這是最後一步!

我嘗試,我得到的,我通過數組循環,不知道如何處理的對象的合併:

for (var i =0; i<my_array.length; i++) { 
    my_array[i].Project // access the object project key 
    my_array[i].Hours  // need to increment hours 
} 

回答

2

您嘗試,你錯過了創建新陣列

var newArray = []; 
var uniqueprojects = {}; 
for (var i =0; i<my_array.length; i++) { 

    if (!uniqueproject[my_array[i].Project]) 
    { 
    uniqueproject[my_array[i].Project] = 0; 
    } 
    uniqueproject[my_array[i].Project] += my_array[i].Hours; 
    //my_array[i].Project // access the object project key 
    //my_array[i].Hours  // need to increment hours 
} 

現在創建出最終的輸出數組out of uniqueproject map

newArray = Object.keys(uniqueproject).map(function(key){return {Project:key, Hours:uniqueproject[key]}}); 
+0

僅供參考我只是在jsPerf上測試了您的代碼,並將它與其他建議的解決方案進行了比較,您的代碼更快。看到我的帖子下面。 – Miqi180

7

創建另一個對象,你實際上可以組項目,並積累相應的小時,這樣

var groups = my_array.reduce(function(resultObject, currentObject) { 

    // if this is the first time the project appears in the array, use zero as the 
    // default hours 
    resultObject[currentObject.Project] = resultObject[currentObject.Project] || 0; 

    // add the current hours corresponding to the project 
    resultObject[currentObject.Project] += currentObject.Hours; 

    return resultObject; 
}, {}); 

在這一點上,你groups看起來像這樣

console.log(groups); 
// { A: 8, B: 3, C: 14 } 

現在,你只需要擴大這個對象,這樣

var result = Object.keys(groups).map(function(currentGroup) { 
    return {Project: currentGroup, Hours: groups[currentGroup]}; 
}); 

現在,結果將是

[ { Project: 'A', Hours: 8 }, 
    { Project: 'B', Hours: 3 }, 
    { Project: 'C', Hours: 14 } ] 
2

兩個thefourtheye的和gurvinder372的提出瞭解決辦法工作,所以我成立了一個基準測試上jsPerf測試速度更快。你可以看到它here

看來gurvinder372的代碼是迄今爲止最快的。

P.S.請忽略Uncaught TypeError,因爲它是一個目前正在修復的與測試結果無關的jsPerf問題。欲瞭解更多信息,請參閱thisthis

相關問題