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

问题描述 投票:0回答:1

我有以下对象数组。

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. 当有两个(或更多)对象具有相同的信息时 createdOn 日期,则其 value应将其添加到一个单一的对象中。createdOn 键。
  2. 每个对象的 value然后还需要加在一起,形成一个累积的value 的对象。

在通过SO搜索了一下之后,我发现 一些代码 这有助于我实现第一点。

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

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

先谢谢你,祝你周末愉快。

javascript arrays reduce accumulate
1个回答
0
投票

我会这样做。首先计算每一个不同的累积值 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;
  }
});

0
投票

这个怎么样?

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);
© www.soinside.com 2019 - 2024. All rights reserved.