猿问

对象的 Javascript 对象数组对项目键的值求和,然后连续对值求和

我有以下对象数组:


const dataSet = [

  {

    createdOn: '2020-06-01',

    id: 1,

    value: 12

  },

  {

    createdOn: '2020-06-01',

    id: 2,

    value: 23

  },

  {

    createdOn: '2020-06-02',

    id: 3,

    value: 40

  },

  {

    createdOn: '2020-06-03',

    id: 4,

    value: 15

  }

]

我希望能够返回的是以下内容:


[

  {

    createdOn: '2020-06-01',

    value: 35 // sum of 12 + 23

  },

  {

    createdOn: '2020-06-02',

    value: 75 // sum of 35 + 40

  },

  {

    createdOn: '2020-06-03',

    value: 90 // sum of 75 + 15

  }

]

因此,我所追求的结果是:

  1. 当存在两个(或多个)具有相同日期的对象时,则应将它们的 s 一起添加到该键的单个对象中。createdOnvaluecreatedOn

  2. 然后,每个对象也需要加在一起,从前一个对象创建一个累积的。valuevalue

经过一些搜索,我找到了一些代码,可以帮助我实现第一点:

dataSet.reduce((acc, cur) => {

  const date = cur.createdOn

  const found = acc.find(elem => elem.createdOn === date)


  if (found) {

    found.value += cur.value

  } else {

    acc.push(cur)

  }

  return acc

}, [])

我只是不知道如何实现累积价值部分。


提前致谢,祝您周末愉快。


智慧大石
浏览 86回答 2
2回答

紫衣仙女

我会这样做。首先计算每个不同值的累积值,然后将生成的映射转换回数组:createdOnconst map = dataSet.reduce((acc, {createdOn, value}) => {  acc[createdOn] = value + (acc[createdOn] || 0);  return acc;}, {});const result = Object.entries(map).map(([key, value], index) => ({  createdOn: key,  value: value}));result.forEach((item, index) => {  if (index) {     item.value += result[index - 1].value;  }});

浮云间

这个怎么样:var dataSet = [ { createdOn: '2020-06-01', id: 1, value: 12 }, { createdOn: '2020-06-01', id: 2, value: 23 }, { createdOn: '2020-06-02', id: 3, value: 40 }, { createdOn: '2020-06-03', id: 4, value: 15 }];var finalResult = Object.values(dataSet.reduce((acc, {createdOn, value})=>{    acc[createdOn] = acc[createdOn] || {createdOn, value:0};    acc[createdOn].value+=value;    return acc;},{})).map((e,i,self)=>(e.value+=self[i-1] ? self[i-1].value : 0, e));console.log(finalResult);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答