JavaScript中动态实现对象数组多属性累计求和方案
实现思路
- 首先提取数组首个元素中值为数值类型的键列表,自动跳过
subject这类非数值字段,不需要手动指定 - 维护一个累计值存储对象,记录各数值键的当前滚动总和
- 遍历原数组的每个元素,基于原对象生成新对象,对每个数值键累加更新值,不修改原数组数据
实现代码
let a = [ {"subject": "Civil", "a": 100, "b":50, "c":100 }, {"subject": "aero", "a": 200, "b":130,"c":100 }, {"subject": "tribe", "a": 100, "b":100,"c":600 }, {"subject": "solen", "a": 400, "b":150,"c":100}, {"subject": "space", "a": 100, "b":100,"c":900 } ]; // 提取所有数值类型的键 const numKeys = Object.keys(a[0]).filter(key => typeof a[0][key] === 'number'); // 初始化累计对象 const sumCache = Object.fromEntries(numKeys.map(key => [key, 0])); // 遍历计算滚动累计 const result = a.map(item => { const newItem = {...item}; numKeys.forEach(key => { sumCache[key] += item[key]; newItem[key] = sumCache[key]; }); return newItem; }); console.log(result);
代码说明
- 自动识别数值键:哪怕后续新增
d/e等其他数值字段,也不需要修改代码,自动适配 - 不污染原数组:所有操作都基于原对象的浅拷贝完成,原数组
a的内容不会被修改 - 兼容边界场景:如果数组为空会直接返回空数组,不会触发异常
内容的提问来源于stack exchange,提问作者Jeery sum code
相关产品推荐
相关产品推荐

