JS递归计算嵌套对象偶数和结果错误、遍历遗漏问题排查
问题根源
你的代码存在两个核心bug,直接导致结果错误、遍历不全:
- 遍历到嵌套对象时使用
return返回递归结果,会直接终止当前层级的for...in循环,处理完c属性的分支后就直接退出函数,自然不会遍历到后面的e属性。 - 递归时把当前已经累加的
sum作为参数传入下一层,同时又把下一层递归的返回值加到当前sum上,造成数值重复累加,最终结果比正确值多2。
修复后代码
function nestedEvenSum(obj) { let sum = 0; for (const k in obj) { if (typeof obj[k] === 'object' && obj[k] !== null) { // 仅累加子层递归结果,不做return终止循环 sum += nestedEvenSum(obj[k]); } if (typeof obj[k] === 'number' && obj[k] % 2 === 0) { sum += obj[k]; } } return sum; } const obj = { a: 2, c: {c: {c: 2}, cc: 'b', ccc: 5}, e: {e: {e: 2}, ee: 'car'} } console.log(nestedEvenSum(obj)); // 输出6,符合预期
修复说明
- 移除了嵌套对象判断分支里的
return,保证当前层所有属性都能被遍历到,不会遗漏e分支 - 去掉递归函数的
sum入参,每一层递归独立统计当前层及下属嵌套层的偶数和,返回后直接累加到上层总和,彻底避免重复计算 - 补充了
null值判断,因为typeof null返回值也是object,避免遇到null值时抛出运行错误
内容的提问来源于stack exchange,提问作者godhar
相关产品推荐
相关产品推荐

