如何解决如何总结reduce对象中的特定元素?
假设我有这个对象数组:
const arrayOfObjects = [
{ task: "work",time: 1 },{ task: "travel",time: 4 },{ task: "work",time: 5 },{ task: "eat",time: 3 },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 },];
console.log(sumOfObjects(arrayOfObjects));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。