使用Lodash按多个属性分组对象数组

时间:2018-03-19 12:37:24

标签: javascript lodash

lodash库组元素有2个属性可以

吗? 我有这样的对象数组:

[{
   id: 1,
   amount: 2000,
   date: "2018-01-31T00:00:00.000Z"
},{
   id: 2,
   amount: 3000,
   date: "2017-07-31T00:00:00.000Z"
},{
   id: 3,
   amount: 6000,
   date: "2018-01-31T00:00:00.000Z"
},{
   id: 4,
   amount: 7000,
   date: "2017-01-31T00:00:00.000Z"
},{
   id: 5,
   amount: 5000,
   date: "2017-03-31T00:00:00.000Z"
},{
   id: 6,
   amount: 3000,
   date: "2018-02-22T00:00:00.000Z"
},{
   id: 7,
   amount: 4500,
   date: "2017-01-31T00:00:00.000Z"
}]

我的目标是数组中的组对象:

  1. 该分组的目的是我在结果顺序中需要这些对象'最新金额总和。因此,我需要区分2017年1月和2018年1月。它应该是2个不同的群体。

    我不确定我的方法是否正确,所以我在这里写下我要求的输出:

    [
      3000, // sum of 2018-2
      8000, // sum of 2018-1
      3000 // sum of 2017-7
      5000 // sum of 2017-3
      11500 // sum of 2017-1
    ]
    

    我尝试了以下命令,但它不起作用并给我错误:

      let xxx = _(data)
        .groupBy(function(i) {
          new Date(i.date).getFullYear()
        })
        .groupBy(function(i) {
          new Date(i.date).getMonth()
        })
        .map(x => x.amount)
        .sum()
        .orderBy('date').value();
    
    你可以帮我解决一下吗?感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用groupBy连接您的年份和月份并使用它。

var grouped = _.groupBy(data, function(i) {
  return new Date(i.date).getFullYear()+'-'+new Date(i.date).getMonth()
})

var resultUnsorted = _.map(t, (val, key) => ({key: key, val: val.reduce((p, c) => c.amount + p, 0) }));

然后使用_.orderBy

排序
const output = _.orderBy(resultUnsorted, 'key');

您可以使用所需的行为编写自定义排序功能。