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

如何计算JS对象数组各对象的数值键值总和并生成total字段?

问题描述
  • 现有如下结构的对象数组:
    示例结构截图
  • 需求:对每个对象内的所有数值求和,最终输出包含category和total字段的对象,结构示例如下:
{category: "A", total: 44}
  • 规则说明:
    • 原数组索引为0的项中,0+23+21的计算结果,通过新增的total键存储
    • 原数组中存储数值的键名为随机生成(例如其他同结构数组的数值键可能为somethingelse这类名称),无固定命名
    • 每个对象中必定存在固定的category键,其余所有键对应的值均为数值类型,且数值键的数量始终大于1
  • 原有错误实现代码:
newArrayOfObjects.forEach(element => {
    Object.values(element).reduce((a, b) => a + b);
});
原有代码问题点
  • forEach遍历过程中仅做了计算,没有存储计算结果,也没有给对象新增total字段,计算值执行完就被丢弃
  • Object.values(element)会把category对应的字符串值纳入累加,会触发字符串拼接逻辑,得到错误的拼接结果
  • reduce未传入初始值0,累加器初始值会取数组第一个元素,如果第一个元素是category的字符串值,后续所有累加都会变成字符串拼接,完全不符合数值求和的预期
最优实现

推荐用无副作用的纯函数写法,不修改原数组,直接返回符合结构的新数组:

const res = newArrayOfObjects.map(item => {
  // 累加时跳过category字段,剩余字段全为数值直接求和
  const total = Object.keys(item).reduce((sum, key) => {
    return key === 'category' ? sum : sum + item[key]
  }, 0)
  return { category: item.category, total }
})

如果需要直接修改原数组,可以用forEach版本:

newArrayOfObjects.forEach(item => {
  item.total = Object.keys(item).reduce((sum, key) => {
    return key === 'category' ? sum : sum + item[key]
  }, 0)
})

内容的提问来源于stack exchange,提问作者One_for_all

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:30:48