迭代javascript数组和求和属性

时间:2016-07-06 23:40:00

标签: javascript arrays sorting array-algorithms

考虑一个包含对象的数组。数组的每个对象都由labelvalue属性组成。我希望能够比较数组的每个对象,如果标签相同,则将它们的值相加,以使标签不重复并具有所有先前值的总和。

例如,如果数组是这样的:

[{
  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;

              }
            };

但是我被困在这里并且没有关于如何处理非重复值的想法。 我需要最后一个数组仍然是一个数组,而不是一个对象。

2 个答案:

答案 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}