如何计算对象数组中指定字段的总和并返回结果对象?
问题:计算评分字段总和
需求说明
给定对象数组reviews,需计算其中job_security、skill_development和company_culture三个字段的数值总和,最终返回包含各字段总和的对象(数值以字符串格式保留一位小数)。
示例输入
const reviews = [ { id: 1, job_security: '2.0', skill_development: '3.0', company_culture: '4.0', is_anonymous: false, pros: 'Test 1...', cons: "Test 1...", created_at: '2022-10-19T19:07:18.000Z', }, { id: 2, job_security: '3.0', skill_development: '1.0', company_culture: '2.0', is_anonymous: false, pros: 'Test 2...', cons: "Test 2...", created_at: '2022-10-19T19:07:25.000Z', }, { id: 3, job_security: '4.0', skill_development: '1.0', company_culture: '2.0', is_anonymous: false, pros: 'Test 3...', cons: "Test 3...", created_at: '2022-10-19T19:07:35.000Z', } ];
期望输出(注:示例输出数值存在笔误,实际正确总和应为job_security: '9.0'、skill_development: '5.0'、company_culture: '8.0')
{ job_security: '4.0', skill_development: '6.0', company_culture: '7.0', }
当前实现代码(存在问题)
const filteredKeys = [ 'job_security' 'company_culture', 'skill_development', ]; reviews.forEach((review: any) => { Object.keys(review).reduce( (accu: any, key: string) => { if (filteredKeys.includes(key)) { const rating = Number(review[key]); accu[key] = accu[key] || rating; accu[key] += rating; } return accu; }, Object.create(null) ); });
问题分析
当前代码存在三处关键问题:
- 语法错误:
filteredKeys数组中'job_security'后缺失逗号,导致数组定义无效 - 累积逻辑错误:在
forEach循环内每次调用reduce都创建新的空对象,无法将所有元素的数值累积到同一个结果对象中 - 累加计算错误:
accu[key] = accu[key] || rating;会在第一次赋值时将rating赋值给accu[key],随后又执行+= rating,导致第一次数值被重复累加
修正后的代码实现
const filteredKeys = [ 'job_security', 'company_culture', 'skill_development', ]; const totalRatings = reviews.reduce((accu, review) => { // 遍历目标字段,累加数值 filteredKeys.forEach(key => { const rating = Number(review[key]); // 初始值为0,避免未定义时的逻辑错误 accu[key] = (accu[key] || 0) + rating; }); // 将数值转换为保留一位小数的字符串,匹配输出格式 Object.keys(accu).forEach(key => { accu[key] = accu[key].toFixed(1); }); return accu; }, {}); console.log(totalRatings);
代码说明
- 修复了
filteredKeys的语法错误,添加缺失的逗号 - 使用
reduce遍历整个数组,将所有元素的数值累积到同一个结果对象中 - 调整累加逻辑:
(accu[key] || 0) + rating确保初始值为0,避免重复累加第一次的数值 - 最后将计算结果转换为保留一位小数的字符串,符合期望输出的格式
内容的提问来源于stack exchange,提问作者RAHUL KUNDU
相关产品推荐
相关产品推荐

