如何按日期属性将对象捆绑在数组中

时间:2018-11-29 15:58:49

标签: javascript arrays

我有大量的数据。这是一个结构示例:

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,
    },
  },
];

我想花几个小时来编写一个工作功能,但我无法处理。 有什么想法可以像这样捆绑数组吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

您可以为此使用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))

答案 1 :(得分:1)

您也可以使其更加简洁,而不用像这样处理单个values道具:

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, }, }, ];

const result = data.reduce((r, {date, values}) => {
  date = date.substr(0,7)
  r[date] = r[date] 
   ? (Object.keys(values).forEach(k => r[date].values[k] += values[k]), r[date])
   : {date, values}
  return r
}, {})

console.log(Object.values(result))

通过这种方式,您将不会在意3中是否有10values属性,并且可以获得更通用的解决方案。