如何计算JS对象数组各对象的数值键值总和并生成total字段?
问题描述
- 现有如下结构的对象数组:

- 需求:对每个对象内的所有数值求和,最终输出包含
category和total字段的对象,结构示例如下:
{category: "A", total: 44}
- 规则说明:
- 原数组索引为0的项中,0+23+21的计算结果,通过新增的
total键存储 - 原数组中存储数值的键名为随机生成(例如其他同结构数组的数值键可能为
somethingelse这类名称),无固定命名 - 每个对象中必定存在固定的
category键,其余所有键对应的值均为数值类型,且数值键的数量始终大于1
- 原数组索引为0的项中,0+23+21的计算结果,通过新增的
- 原有错误实现代码:
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
相关产品推荐
相关产品推荐

