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

Javascript array of objects sum values for items key then sum values consecutively

我有以下对象数组:

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

我希望能够 return 如下:

[
  {
    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. 当有两个(或更多)对象具有相同的 createdOn 日期时, 那么他们的 values 应该被添加到那个 createdOn 键的单个对象中。
  2. 每个对象的value 然后还需要加在一起,创建一个累积的 value 来自上一个对象。

经过一些搜索,我发现 some code 这有助于我实现第一点:

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
}, [])

我只是想不通如何实现累计值部分。

在此先致谢,祝周末愉快。

我会这样做。首先计算每个不同 createdOn 值的累积值,然后将结果映射转换回数组:

const 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);