如何对reduce对象中的特定元素求和?

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

假设我有这个对象数组:

const arrayOfObjects = [
  { task: "work", time: 1 }, 
  { task: "travel", time: 4 }, 
  { task: "work", time: 5 }, 
  { task: "eat", time: 3 }, 
  { task: "eat", time: 1 }, 
  { task: "eat", time: 5 }
];

并且我想返回一个对象,该对象将每个键作为任务返回,将每个值作为键的所有值的总和返回。 例如,上面数组的生成对象应该是:

sumOfObejcts = {
  work: 6,
  travel: 4,
  eat: 9
}

如何使用reduce函数正确地做到这一点? 我不知道如何总结特定键的所有项目,这是我在尝试了几次示例后所做的:

    const sumOfObejcts = arrayOfObjects.reduce((acc, items) => {
      let { task, time } = items;
      return { ...acc, [task]: [...(acc[task] || []), time] };
    }, {});

我得到的输出是:

{
  work: [1, 5],
  travel: [4],
  eat: [3, 1, 5]
}

所以,我只想返回该值出现次数的总和。

javascript arrays reduce
3个回答
1
投票

你的解决方案非常接近;不同之处在于您在每次迭代中创建值数组,而不是对当前时间值求和。

在这里,我使用三元语句更改了分配给键的值。这会检查累加器对象中是否存在该任务;如果任务已经存在,则意味着该任务已经有一个总和,因此我们只需将当前时间添加到现有总和中。否则,如果累加器对象没有任务,则将使用当前任务的时间来填充该值。

const sumOfObjects = arrayOfObjects
  .reduce((acc, item) =>
    ({ ...acc, [item.task]: (
       acc[item.task] // does the task exist in the accumulator object?
       ? acc[item.task] + item.time // if so, set a value equal to the current task's time plus the existing value
       : item.time // otherwise, prime the task's value to the current time
      ) })
  , {});

1
投票

使用

forEach
并构建对象

const sumOfObjects = (arr, all = {}) => (
  arr.forEach(({ task, time }) => (all[task] = (all[task] ?? 0) + time)), all
);

const arrayOfObjects = [
  { task: "work", time: 1 },
  { task: "travel", time: 4 },
  { task: "work", time: 5 },
  { task: "eat", time: 3 },
  { task: "eat", time: 1 },
  { task: "eat", time: 5 },
];

console.log(sumOfObjects(arrayOfObjects));


0
投票

请使用

For-In Loop
查看解决方案:

const arrayOfObjects = [
    { task: "work", time: 1 }, 
    { task: "travel", time: 4 }, 
    { task: "work", time: 5 }, 
    { task: "eat", time: 3 }, 
    { task: "eat", time: 1 }, 
    { task: "eat", time: 5 }
];

function sumOfObejcts(obj) {
    
    let newObj = {};

    for (const key in obj) {
        if (!newObj[obj[key]['task']]) {
            newObj[obj[key]['task']] = 0;
        }

        newObj[obj[key]['task']] += obj[key]['time'];
    }

    return newObj;
}

console.log(sumOfObejcts(arrayOfObjects));

© www.soinside.com 2019 - 2024. All rights reserved.