2016-07-06 107 views
0

考慮一個包含對象的數組。陣列的每個對象都由labelvalue屬性組成。我希望能夠比較數組中的每個對象,並且如果標籤相同,請將它們的值相加,以便標籤不重複並且具有所有先前值的總和。迭代javascript數組和總和屬性

一樣,例如,如果陣列是這樣的:

[{ 
    label: "A", 
    value: 10 
    }, { 
    label: "B", 
    value: 20 
    }, { 
    label: "C", 
    value: 30 
    }, { 
    label: "C", 
    value: 40 
    }, { 
    label: "D", 
    value: 12 
    }, { 
    label: "D", 
    value: 23 
}] 

最後,我將有隻有四個標籤(A,B,C,d),值10 A中的陣列, 20 B,70 C和35 D.

我試圖用一個for循環:

for (i = 1; i < transformation.length; i++) { 
       if (transformation[i-1].label == transformation[i].label) { 
       result.label.push = transformation[i].label; 
       result.value.push = transformation[i-1].value + transformation[i].value; 

       } 
      }; 

但我來到這裏停留,並就如何處理非重複的值沒有想法。 我需要最後一個數組仍然是一個數組,而不是一個對象。

回答

3

這是Array.reduce的完美案例!

var sums = arr.reduce(function(results, item) { 
    if (!results.hasOwnProperty(item.label)) { 
     results[item.label] = 0; 
    } 

    results[item.label] += item.value; 
    return results; 
}, {}); 

console.log(sums); //Object {A: 10, B: 20, C: 70, D: 35} 

results將包含4個鍵A,B,C,d,每個包含總的時候,它發生在數組中。

+0

隨後'Object.entries(總和).MAP(A =>({標號:一個[0],value:a [1]}));'會用'{label:「X」,value:y}''對象創建一個數組。 – Xufox

+0

@tymeJV由於我不能在結果上使用'.map'函數,所以我不需要它。它返回一個對象而不是返回一個數組。 –

+0

@Xufox我的控制檯說'Object.entries'不是函數 –

0

可以只使用Array.reduce

同@tymeJV,但作爲一個班輪

var sum = transformation.reduce(function(sumAll, item) { 
    sumAll[item.label] = item.value + sumAll[item.label] || 0; 
    return sumAll; 
}, {}) 

console.log(sum) // {"A":10,"B":20,"C":70,"D":35}