【问题标题】:Javascript array of objects sum values for items key then sum values consecutively对象的 Javascript 数组对项目键的值求和,然后连续求和值
【发布时间】:2020-06-12 19:18:26
【问题描述】:

我有以下对象数组:

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 日期时, 那么他们的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
}, [])

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

提前致谢,周末愉快。

【问题讨论】:

  • 取一个 sum 变量并在结果数组上再次循环。更新每个对象的累积和

标签: javascript arrays reduce accumulate


【解决方案1】:

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

【讨论】:

  • 嘿@Aleksey,尝试了你的答案,它返回了[{ createdOn: '2020-06-01', value: 35 },{ createdOn: '2020-06-02', value: 40 },{ createdOn: '2020-06-03', value: 15 }],所以缺少value 从一个对象到下一个对象的累积。
  • 对不起,我错过了这个要求。我编辑了答案并添加了一项操作来累积值。此代码假定初始 dataSet 数组按 createdOn 日期排序。
【解决方案2】:

这个怎么样:

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

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2015-06-06
    • 2023-03-22
    • 2021-10-09
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多