考虑一个包含对象的数组。数组的每个对象都由label
和value
属性组成。我希望能够比较数组的每个对象,如果标签相同,则将它们的值相加,以使标签不重复并具有所有先前值的总和。
例如,如果数组是这样的:
[{
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),A值为10,B为20,C为70,D为35。
我尝试使用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;
}
};
但是我被困在这里并且没有关于如何处理非重复值的想法。 我需要最后一个数组仍然是一个数组,而不是一个对象。
答案 0 :(得分: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,每个键包含它在数组中出现的总次数。
答案 1 :(得分: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}