【问题标题】:Reduce an array of objects and sum property for each distinct object减少每个不同对象的对象数组和总和属性
【发布时间】:2015-09-18 19:00:36
【问题描述】:

我不确定应该查看哪些功能来实现我想要做的事情。可能 reduce 不正确。

一个数据库查询会返回一个类似这样的对象列表:

result = [{group1: 'A', group2: 'A', SUM: 5},
           {group1: 'A', group2: 'B', SUM: 2},
           {group1: 'C', groupe2: 'B', SUM: 3}
         ]

我想“减少”或“分组”这个数组以获得每个不同的 group1group2 值的对象以及它的 SUM 相对值,如下面的对象:

wanted = [{group1: 'A', group1_SUM: 7, group2: 'A', group2_SUM: 5},
          {group1: 'B', group1_SUM: 0, group2: 'B', group2_SUM: 5},
          {group1: 'C', group1_SUM: 3, group2: 'C', group2_SUM: 0}
         ]

也可以是:

wanted = [{groupName: 'A', group1_SUM: 7, group2_SUM: 5},
          {groupName: 'B', group1_SUM: 0, group2_SUM: 5},
          {groupName: 'C', group1_SUM: 3, group2_SUM: 0}
         ]

【问题讨论】:

  • 一种方法是创建一个新数组,循环 result 并将唯一组推送到该数组中。更新总和。
  • 您遇到问题的具体部分是什么?你的代码目前是什么样子的,它是如何失败的?
  • @BelowtheRadar,你想要做什么甚至都不清楚。

标签: javascript


【解决方案1】:

第一个函数减少 result 以找到每个组的总和。

然后我们遍历每个组返回结果。

var result = [{group1: 'A', group2: 'A', SUM: 5},
  {group1: 'A', group2: 'B', SUM: 2},
  {group1: 'C', group2: 'B', SUM: 3}
];

(function groupSum(result) {
  var sums = result.reduce(function(a, e) {
    a.group1_SUM[e.group1] = (a.group1_SUM[e.group1] || 0) + e.SUM;
    a.group2_SUM[e.group2] = (a.group2_SUM[e.group2] || 0) + e.SUM;
    return a;
  }, {group1_SUM: {}, group2_SUM: {}});

  return Array.from(new Set(Object.keys(sums.group1_SUM).concat(Object.keys(sums.group2_SUM)))).map(function(e) {
    return {
      groupName: e, group1_SUM: sums.group1_SUM[e] || 0, group2_SUM: sums.group2_SUM[e] || 0
    }
  });
})(result);

【讨论】:

  • @BelowtheRadar 将整个 sn-p 复制并粘贴到您的控制台中。返回一个由 3 个对象组成的数组,就像你问的那样
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 2011-02-07
  • 2018-04-15
  • 2017-11-08
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多