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

如何高效按键值计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:01:17