基于密钥的对象减少和求和

时间:2017-04-18 20:56:10

标签: javascript object coffeescript reduce

假设我在CoffeeScript中有以下对象数组:

data = [
  {date: "04/27/2017", number: 1},
  {date: "04/28/2017", number: 2},
  {date: "04/27/2017", number: 3},
  {date: "04/29/2017", number: 4},
  {date: "04/29/2017", number: 5}
]

我希望按日期值对数值求和,创建这个新数组:

new_data = [
  {date: "04/27/2017", number: 4},
  {date: "04/28/2017", number: 2},
  {date: "04/29/2017", number: 9}
]

使用reduce方法似乎是合理的,例如:

new_data = data.reduce (x, y) ->
  some logic

但我不能为我的生活找到/找到一种方法来做这件事......

1 个答案:

答案 0 :(得分:0)

你可以通过两个步骤完成你想要的任务

  1. 将值分组到单个对象

    let reducer = (acc, cur) => {
      if (acc[cur.date] === undefined)
        acc[cur.date] = cur.number
      else
        acc[cur.date] = acc[cur.date] + cur.number
      return acc;
    }
    
    let grouped = data.reduce(reducer, {});
    
  2. 将对象映射到数组

    Object.keys(counterRes).map((date) => { return { date, number: grouped[date] } })
    
  3. 最终结果就是你所追求的目标。