簡體   English   中英

在javascript中使用相同的鍵合並對象

[英]Merge objects with same key in 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
}

您可以創建另一個對象,您可以在其中實際對項目進行分組並累積相應的小時數,如下所示

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

您的嘗試中 ,您錯過了創建新陣列的過程

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
}

現在從uniqueproject map創建最終輸出數組

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

thefourtheyegurvinder372提出的解決方案都有效,所以我在jsPerf上設置了一個基准測試來測試哪個更快。 你可以在這里看到它。

似乎gurvinder372的代碼是迄今為止最快的代碼。

PS請忽略Uncaught TypeError因為它是一個當前正在修復的jsPerf問題,與測試結果無關。 欲了解更多信息,請參閱這個

暫無
暫無

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

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