javascript - ES6 嵌套分组求和

标签 javascript ecmascript-6 lodash

我有一个这样的数组:

[{
   id: 1,
   amount: 10,
   date: '21/01/2017'
},{
   id: 1,
   amount: 10,
   date: '21/01/2017'
},{
   id: 1,
   amount: 30,
   date: '22/01/2017'
},{
   id: 2,
   amount: 10,
   date: '21/01/2017'
},]

我希望这样输出:

{
  '21/01/2017': {
    1: {
      amount: 20
    },
    2: {
      amount: 10
    }
  },
  '22/01/2017': {
    1: {
      amount: 30
    }
  }
}

本质上是按数据分组,按 id 嵌套分组,同时对相关金额求和。

到目前为止,我已经尝试使用 reduce,并查看了 lodash 函数,但都没有成功。 Reduce 使按一个 Prop 分组和求和变得容易,但我找不到一种优雅的方式来创建第二个层次。我创建了一个沙箱来演示:

https://codesandbox.io/s/woj9xz6nq5

const dataToConsolidate = [{
  id: 1,
  amount: 10,
  date: '21/01/2017'
}, {
  id: 1,
  amount: 10,
  date: '21/01/2017'
}, {
  id: 1,
  amount: 30,
  date: '22/01/2017'
}, {
  id: 2,
  amount: 10,
  date: '21/01/2017'
},]

export const consolidate = (data) => {
  const result = data.reduce(function (res, obj) {

    (!(obj.date in res)) ?
      res.__array.push(res[obj.date] = obj) :
      res[obj.date].amount += obj.amount;

    return res;
  }, { __array: [] });

  return result;
};

console.log(consolidate(dataToConsolidate))

最佳答案

您可以将对象作为哈希表并添加具有默认样式的属性。

var array = [{ id: 1, amount: 10, date: '21/01/2017' }, { id: 1, amount: 10, date: '21/01/2017' }, { id: 1, amount: 30, date: '22/01/2017' }, { id: 2, amount: 10, date: '21/01/2017' }],
    result = {};

array.forEach(function (o) {
    result[o.date] = result[o.date] || {};
    result[o.date][o.id] = result[o.date][o.id] || { amount: 0 };
    result[o.date][o.id].amount += o.amount;
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - ES6 嵌套分组求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47582715/

相关文章:

javascript - 使用字符串作为键设置对象的值

javascript - obj.key=value 和 obj.set(key, value) 之间的区别?

javascript - 以不可变的方式更新数组中的一个对象

javascript - 用 laravel-mix 编译的 ES6 库不起作用

javascript - ES6/lodash - 使用startsWith检查嵌套对象值

javascript - 展平数组,但使用子数组作为基础

javascript - 如何使用 Nv.d3.js 库将饼图置于顶部?

Javascript 从内部对象引用外部对象

c# - javascript:history.back() 在机器上触发回发,但在预编译时不会触发

node.js - 使用 lodash ._template 发送电子邮件