首页 > 解决方案 > 如何按日期属性捆绑数组中的对象

问题描述

我有一个包含数据的大数组。下面是一个结构示例:

let data = [
  {
    date: '2018-11-22',
    values: {
      a: 10,
      b: 20,
      c: 5,
    },
  },
  {
    date: '2018-11-17',
    values: {
      a: 5,
      b: 10,
      c: 15,
    },
  },
  {
    date: '2018-06-29',
    values: {
      a: 10,
      b: 30,
      c: 10,
    },
  },
  {
    date: '2017-12-20',
    values: {
      a: 30,
      b: 40,
      c: 5,
    },
  },
];

我需要按月和年在新数组中构造这些数据。应该对每个月的价值属性进行总结。

因此示例的新数组应如下所示:

let sortedData = [
  {
    date: '2018-11',
    values: {
      a: 15,
      b: 30,
      c: 20,
    },
  },
  {
    date: '2018-06',
    values: {
      a: 10,
      b: 30,
      c: 10,
    },
  },
  {
    date: '2017-12',
    values: {
      a: 30,
      b: 40,
      c: 5,
    },
  },
];

我正在尝试几个小时来编写一个工作函数,但我无法处理它。有什么想法可以捆绑这样的数组吗?

谢谢你的帮助!

标签: javascriptarrays

解决方案


你可以用Array.reduce这个

let data = [  {    date: '2018-11-22',    values: {      a: 10,      b: 20,      c: 5,    },  },  {    date: '2018-11-17',    values: {      a: 5,      b: 10,      c: 15,    },  },  {    date: '2018-06-29',    values: {      a: 10,      b: 30,      c: 10,    },  },  {    date: '2017-12-20',    values: {      a: 30,      b: 40,      c: 5,    },  },];

let res = data.reduce((o, {date, values}) => {
  let k = date.slice(0, 7)
  
  o[k] = o[k] || {date: k, values: {a: 0, b: 0, c:0}}
  o[k].values.a += values.a
  o[k].values.b += values.b
  o[k].values.c += values.c
  
  return o
}, {})

console.log(Object.values(res))


推荐阅读