假设我有这个对象数组:
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]
}
所以,我只想返回该值出现次数的总和。
你的解决方案非常接近;不同之处在于您在每次迭代中创建值数组,而不是对当前时间值求和。
在这里,我使用三元语句更改了分配给键的值。这会检查累加器对象中是否存在该任务;如果任务已经存在,则意味着该任务已经有一个总和,因此我们只需将当前时间添加到现有总和中。否则,如果累加器对象没有任务,则将使用当前任务的时间来填充该值。
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
) })
, {});
使用
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));
请使用
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));