使用Underscore或Lodash将行数组缩减为汇总的总计行

时间:2015-09-14 23:37:58

标签: javascript underscore.js lodash

我有一个如下所示的行数组:

[
  { 
    metric1: 50,
    metric2: 60
  },
  {
    metric1: 100,
    metric2: 120;
  }
]

我希望将其减少为一行,如下所示:

{
  metric1: 150,
  metric2: 180
}

到目前为止,我有一个非常简单的方法:

_.reduce(function(row, aggregate) {
  _.each(row, function(value, metric) {
    aggregate[metric] = aggregate[metric] || 0;
    aggregate[metric] += value;
  });
  return aggregate;
}, {});

但是真的觉得使用Underscore或Lodash功能编程可以做得更干净。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

你可以用vanilla javascript干净利落地完成:

var result = data.reduce(function(totals, v) {
    totals.metric1 += v.metric1;
    totals.metric2 += v.metric2;
    return totals;
}, {metric1: 0, metric2: 0});

编辑:如果在运行时之前不知道度量标准名称,那么您的解决方案可以正常工作。以下是使用_.merge的另一种解决方案:

var result = _.merge.apply(null, [{}].concat(data).concat(function(total, v) {
  return (total || 0) + v;
}));

或者如果你正在使用ES6:

var result = _.merge({}, ...data, (total=0, v) => {
  return total + v;
});