如何高效按键值计算JavaScript数组对象的总和?
高效实现数组对象的字段汇总
你的原方案通过三次reduce遍历数组分别计算每个字段的总和,这种方式会重复遍历数组三次,效率较低。可以通过单次reduce遍历完成所有字段的累加,大幅提升效率,同时保持代码简洁。
方案一:动态匹配需累加的字段(扩展性强)
这种方式无需硬编码字段名,自动处理所有以Y开头的字段,适合字段数量可能变化的场景:
const objs = [ {Name : 'A', Y1 : '1', Y2 : '1', Y3 : '1'}, {Name : 'B', Y1 : '2', Y2 : '3', Y3 : '3'}, {Name : 'C', Y1 : '1', Y2 : '1', Y3 : '6'} ]; // 初始化汇总对象,先设置Name为Total const totalObj = objs.reduce((acc, curr) => { // 遍历当前对象的所有属性 for (const key in curr) { // 只处理以Y开头的数值字段 if (key.startsWith('Y')) { // 转成数字累加,避免字符串拼接错误 acc[key] = (Number(acc[key]) || 0) + Number(curr[key]); } } return acc; }, { Name: 'Total' }); // 将累加后的数字转回字符串,和原数据格式保持一致 for (const key in totalObj) { if (key.startsWith('Y')) { totalObj[key] = totalObj[key].toString(); } } console.log(totalObj); // 输出:{ Name: 'Total', Y1: '4', Y2: '5', Y3: '10' }
方案二:硬编码字段(性能略优)
如果确定只会有Y1/Y2/Y3这三个字段,可以直接硬编码处理,减少循环判断的开销:
const objs = [ {Name : 'A', Y1 : '1', Y2 : '1', Y3 : '1'}, {Name : 'B', Y1 : '2', Y2 : '3', Y3 : '3'}, {Name : 'C', Y1 : '1', Y2 : '1', Y3 : '6'} ]; const totalObj = objs.reduce((acc, curr) => { acc.Y1 = (Number(acc.Y1) || 0) + Number(curr.Y1); acc.Y2 = (Number(acc.Y2) || 0) + Number(curr.Y2); acc.Y3 = (Number(acc.Y3) || 0) + Number(curr.Y3); return acc; }, { Name: 'Total' }); // 转换为字符串格式 totalObj.Y1 = totalObj.Y1.toString(); totalObj.Y2 = totalObj.Y2.toString(); totalObj.Y3 = totalObj.Y3.toString(); console.log(totalObj); // 输出:{ Name: 'Total', Y1: '4', Y2: '5', Y3: '10' }
核心优化点
- 只遍历数组一次,避免多次遍历的性能损耗
- 处理字段时先转成数字再累加,避免字符串拼接导致的错误(比如
'1'+'2'='12') - 最后转回字符串,保证输出格式和原数据一致
内容的提问来源于stack exchange,提问作者AfterFray
相关产品推荐
相关产品推荐

