You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归——嵌套数组求和:无循环实现遇问题求助

嘿,我来帮你搞定这个嵌套数组求和的问题!不用写显式循环的话,递归结合数组的高阶方法(比如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,完全正确!

再给你拆解下这段代码的逻辑:

  1. reduce方法会自动遍历数组的每个元素,我们给它设置初始值0,这样即使遇到空数组(比如你例子里的[]),reduce也会直接返回0,不会干扰总和计算。
  2. 对每个元素,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:18:32