使用reduce方法累加对象数组a属性值时返回NaN,求问题原因及解决办法
问题分析与解决方案
你的代码确实存在问题,导致输出NaN的原因是:数组中部分对象没有a属性,此时item.a会返回undefined,而undefined与数字相加的结果就是NaN,一旦出现NaN,后续所有累加都会保持NaN。
要实现仅对包含a键的元素求和,有两种常用方案:
方案一:在reduce中直接判断属性是否存在
const numbers = [{ a: 1 }, { a: 6 }, { a: 3 }, { d: 4 }, { e: 5 }, { f: 5 }]; const filterNumbers = numbers.reduce((currenttotal, item) => { // 仅当对象包含a属性时才累加 return 'a' in item ? item.a + currenttotal : currenttotal; }, 0); console.log(filterNumbers); // 输出 10
这里用'a' in item判断对象是否包含a属性,也可以用item.hasOwnProperty('a'),区别是前者会检查原型链,后者只检查自身属性,根据你的场景选择即可。
方案二:先过滤再求和
const numbers = [{ a: 1 }, { a: 6 }, { a: 3 }, { d: 4 }, { e: 5 }, { f: 5 }]; const filterNumbers = numbers .filter(item => 'a' in item) // 先筛选出含a属性的对象 .reduce((currenttotal, item) => item.a + currenttotal, 0); console.log(filterNumbers); // 输出 10
这种方式代码逻辑更直观,可读性更强,适合复杂场景下的逻辑拆分。
内容的提问来源于stack exchange,提问作者user19161372
相关产品推荐
相关产品推荐

