如何结合filter与reduce实现数组数值求和?含代码问题排查
解决人员数组数值求和问题(箭头函数+filter/reduce实现)
核心需求实现
如果你需要提取数组中每个人员对象里的所有数值类型属性并求和,同时支持空数组返回0,可以用箭头函数结合reduce和filter实现:
const totalNums = (arr) => { return arr.reduce((total, person) => { // 提取当前对象的所有属性值,过滤出数值类型 const numericValues = Object.values(person).filter(val => typeof val === 'number'); // 将当前对象的数值累加到总和中 return total + numericValues.reduce((sum, num) => sum + num, 0); }, 0); };
如果你的需求只是提取age属性求和(匹配示例场景),可以简化成更简洁的版本:
const totalNums = (arr) => arr.reduce((total, person) => total + (person.age ?? 0), 0);
测试示例
// 示例输入数组 const people = [ { name: 'Clarie', age: 22 }, { name: 'Bobby', age: 30 }, { name: 'Antonio', age: 40 } ]; console.log(totalNums(people)); // 输出92 console.log(totalNums([])); // 输出0
原代码错误分析
- 第一个版本错误:
const totalNums = arr => arr.reduce((a,b) => a + b, 0)
这里的b是数组中的人员对象,直接执行a + b会把对象转为字符串拼接,得到类似"0[object Object][object Object]"的无效结果,而非数值求和。
- 第二个版本错误:
function totalNums(person) { person.reduce((a,b) => a + b, 0) return person.age; }
- 参数
person实际是数组,数组没有age属性,返回值为undefined; reduce的运算结果未被使用,属于无效执行;- 传入空数组时,
person.age依然是undefined,不符合空数组返回0的要求。
内容的提问来源于stack exchange,提问作者SarahCodes
相关产品推荐
相关产品推荐

