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
相关产品推荐
相关产品推荐

