【问题标题】:Iterate javascript array and sum attributes迭代javascript数组和求和属性
【发布时间】:2016-07-06 23:40:00
【问题描述】:

考虑一个包含对象的数组。数组的每个对象都由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;

              }
            };

但我被困在这里,不知道如何处理非重复值。 我需要最终的数组仍然是一个数组,而不是一个对象。

【问题讨论】:

    标签: javascript arrays sorting array-algorithms


    【解决方案1】:

    这是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,每个键包含它在数组中出现的总次数。

    【讨论】:

    • 随后的Object.entries(sums).map(a =&gt; ({label: a[0], value: a[1]})); 将创建一个包含{label: "X", value: y} 之类的对象的数组。
    • @tymeJV 这并不完全有效,因为我不能在结果上使用.map 函数,我确实需要它。它返回一个对象而不是返回一个数组。
    • @Xufox 我的控制台说Object.entries 不是函数
    • @Shoplifter.Doe 好吧,看看那个函数的browser compatibility。几乎没有任何地方支持它。但是,它解决您的问题。
    • @Xufox 是的。我现在记得我前段时间尝试过使用它。难道没有另一种方法可以将结果作为数组而不是对象来获取吗?
    【解决方案2】:

    你可以使用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}
    

    【讨论】:

      猜你喜欢
      • 2018-01-05
      • 2015-09-22
      • 2020-09-07
      • 2021-08-18
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2015-08-29
      • 2015-12-12
      相关资源
      最近更新 更多