递归——嵌套数组求和:无循环实现遇问题求助
嘿,我来帮你搞定这个嵌套数组求和的问题!不用写显式循环的话,递归结合数组的高阶方法(比如reduce)是最常用的思路,先给你分析下可能踩的坑,再给你靠谱的实现方案。
首先,先说说大家常犯的几个错误:
- 判断数组的方式错了:很多人会用
typeof current === 'array',但typeof对数组返回的是object,这会导致嵌套数组被当成普通值处理(比如[3,4]会被转成字符串"3,4"再相加,结果直接出错)。 - 没处理空数组:你例子里有个
[],如果没处理的话,递归到空数组时可能返回undefined,最后总和变成NaN。 - 递归逻辑没写对:比如没把递归返回的子数组和正确累加到总结果里,导致嵌套部分的和完全没被计算。
接下来给你正确的实现,用reduce+递归的方式,完全不用自己写循环:
function nestedSum(arr) { // 用reduce遍历数组,初始值设为0,专门处理空数组的情况 return arr.reduce((total, currentItem) => { // 用Array.isArray()准确判断当前元素是否是嵌套数组 if (Array.isArray(currentItem)) { // 如果是子数组,递归调用求和后加到总结果里 return total + nestedSum(currentItem); } else { // 如果是普通数字,直接累加 return total + currentItem; } }, 0); } // 测试你的例子 console.log(nestedSum([1,2,[3,4],[],[5]])); // 输出15,完全正确!
再给你拆解下这段代码的逻辑:
reduce方法会自动遍历数组的每个元素,我们给它设置初始值0,这样即使遇到空数组(比如你例子里的[]),reduce也会直接返回0,不会干扰总和计算。- 对每个元素,用
Array.isArray()精准判断是不是嵌套数组:- 如果是子数组,就递归调用
nestedSum计算这个子数组的和,再累加到当前总结果里。 - 如果是普通数字,直接加到总结果即可。
- 如果是子数组,就递归调用
如果你觉得reduce有点抽象,也可以用递归结合forEach(虽然forEach内部有循环,但不属于我们自己写的显式循环):
function nestedSum(arr) { let total = 0; arr.forEach(item => { total += Array.isArray(item) ? nestedSum(item) : item; }); return total; }
这两种方法都能正确处理你的测试用例,得到15的结果。
最后再敲个重点:一定要用Array.isArray()来判断数组,别用typeof,这是最容易踩的坑!
内容的提问来源于stack exchange,提问作者jj008
相关产品推荐
相关产品推荐

