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

JavaScript数组对象任意键同组求和返回NaN如何修复

错误原因

你写的reduce代码存在几个核心问题,才会返回NaN结果:

  • 变量引用完全混乱:回调里使用了未定义的b、a、c变量,和reduce的入参acc、curr完全不对应,根本拿不到遍历的实际值
  • 没有遍历对象的动态键:代码里没有逻辑去获取每个数组项除了companyName之外的其他自定义键,自然没法做对应累加
  • 缺少类型判断:没有过滤非数值类型的字段,直接做加法运算很容易得到NaN
  • 初始值逻辑错误:第一次匹配到分组时直接push原对象,没有做累加值的初始化,后续运算会出现undefined加数字的情况得到NaN
修复后的可运行代码

以下代码既适配当前所有companyName为'X'的场景,也兼容后续多公司名分组累加的需求:

const sumResult = this.myarray.reduce((acc, currItem) => {
  // 查找当前公司名是否已经存在累加记录
  const targetIndex = acc.findIndex(item => item.companyName === currItem.companyName);
  
  if (targetIndex > -1) {
    // 遍历当前项的所有键,跳过固定的companyName字段
    Object.keys(currItem).forEach(key => {
      if (key === 'companyName') return;
      const currentVal = currItem[key];
      // 仅对数值类型的值做累加,非数值字段直接跳过
      if (typeof currentVal === 'number') {
        acc[targetIndex][key] = (acc[targetIndex][key] ?? 0) + currentVal;
      }
    });
  } else {
    // 第一次遇到该公司名,拷贝当前项作为初始累加对象,避免修改原数组
    const initGroup = { ...currItem };
    // 初始化时过滤掉非数值的自定义字段,避免后续累加异常
    Object.keys(initGroup).forEach(key => {
      if (key !== 'companyName' && typeof initGroup[key] !== 'number') {
        delete initGroup[key];
      }
    });
    acc.push(initGroup);
  }

  return acc;
}, []);

// sumResult就是你需要的结果数组

如果你确定数组里所有项的companyName都是固定值'X',还可以用更简化的版本:

// 简化版(仅适配单companyName场景)
const result = this.myarray.reduce((acc, curr) => {
  Object.keys(curr).forEach(key => {
    if (key === 'companyName') return;
    if (typeof curr[key] === 'number') {
      acc[0][key] = (acc[0][key] ?? 0) + curr[key];
    }
  });
  return acc;
}, [{ companyName: 'X' }]);
效果验证

用你给出的示例数据运行,最终得到的结果完全符合预期:

[
  { companyName: 'X', randomKey: 1011, randomKey2: 337 /* 其他自定义数值键的累加结果 */ }
]

内容的提问来源于stack exchange,提问作者naru-magi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:01:29