You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算对象数组中指定字段的总和并返回结果对象?

问题:计算评分字段总和

需求说明

给定对象数组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)
   );
});

问题分析

当前代码存在三处关键问题:

  1. 语法错误:filteredKeys数组中'job_security'后缺失逗号,导致数组定义无效
  2. 累积逻辑错误:在forEach循环内每次调用reduce都创建新的空对象,无法将所有元素的数值累积到同一个结果对象中
  3. 累加计算错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:30:51