如何实现接收数组提取数字求和的函数?排查现有代码问题
问题排查与解决方案
原代码的问题分析
- 参数命名混淆:函数接收的是人员数组,但参数名
person容易误解为单个对象,语义不准确 reduce使用错误:- 调用
reduce后未保存计算结果,直接丢弃了累加值 - 回调函数
a + b是把累加器和整个对象相加,没有提取对象的age属性进行计算
- 调用
- 返回值逻辑错误:直接返回
person.age,但person是数组,根本不存在age属性,空数组调用时会返回undefined,不符合空数组返回0的要求
可行实现方案
基础版(直接累加age)
这个版本针对确定每个对象都有合法age数字的场景,用reduce直接完成累加,空数组传入时reduce的初始值0会直接返回,符合要求:
function totalNums(people) { return people.reduce((total, person) => total + person.age, 0); } // 测试用例 const samplePeople = [ { name: 'Clarie', age: 22 }, { name: 'Bobby', age: 30 }, { name: 'Antonio', age: 40 }, ]; console.log(totalNums(samplePeople)); // 输出92 console.log(totalNums([])); // 输出0
健壮版(结合filter过滤无效数据)
如果需要处理可能存在无效age的场景(比如age不是数字、不存在age属性),可以先用filter筛选出有效数据,再用reduce累加:
function totalNums(people) { // 过滤出包含有效数字类型age的对象 const validEntries = people.filter(person => typeof person.age === 'number' && !isNaN(person.age) ); return validEntries.reduce((total, person) => total + person.age, 0); } // 测试用例 const mixedPeople = [ { name: 'Clarie', age: 22 }, { name: 'Bobby', age: 30 }, { name: 'Antonio', age: 40 }, { name: 'Tom', age: 'invalid' }, // 会被过滤 { name: 'Jerry' } // 无age属性,会被过滤 ]; console.log(totalNums(mixedPeople)); // 输出92 console.log(totalNums([])); // 输出0
内容的提问来源于stack exchange,提问作者SarahCodes
相关产品推荐
相关产品推荐

