减少每个不同对象的对象数组和sum属性

时间:2015-09-18 19:00:37

标签: javascript

我不确定我应该考虑哪些功能来实现我想要做的事情。可能减少是不正确的。

数据库查询返回一个对象列表,如下所示:

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

我想"减少"或" group"这个数组为每个不同的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}
         ]

1 个答案:

答案 0 :(得分:2)

第一个函数减少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);