如何用JavaScript递归统计嵌套数组的总数?
递归统计嵌套数组总数的正确实现
先梳理你代码里的几个核心问题:
for(let element in array);末尾的分号直接终止了循环,后面的if语句和循环完全无关,等于白写。而且用in遍历数组容易拿到非元素属性,建议用of遍历数组元素。if(Array.isArray(array))判断的是整个传入的数组,而非当前遍历的元素,完全搞错了判断对象。- 递归调用传的是原数组
array,不是当前的子元素,会导致无限递归。 - 函数没有返回值,所以
console.log会输出undefined,根本拿不到统计结果。
正确实现思路
每个数组本身算1个,然后遍历它的每一个元素:
- 初始化总数为1(当前数组本身)。
- 遍历数组的每个元素,如果元素是数组,就递归统计这个子数组的数量,加到总数里。
- 最后返回统计好的总数。
修正后的代码
function countArrays(array) { // 当前数组本身算1个 let sumTotal = 1; // 遍历数组的每个元素 for (const element of array) { // 判断当前元素是否是数组 if (Array.isArray(element)) { // 递归统计子数组的数量并累加 sumTotal += countArrays(element); } } // 返回总数 return sumTotal; } // 测试用例 console.log(countArrays([1, 2, 3])) // 输出1,正确 console.log(countArrays([1, [1, 2, 3], 3])) // 输出2,正确 console.log(countArrays([[1,2],[3,[4]]])) // 输出4,正确(外层数组+两个子数组+最内层数组)
递归逻辑解释
以第二个测试用例[1, [1,2,3], 3]为例:
- 第一次调用
countArrays,sumTotal初始为1。 - 遍历元素:1不是数组,跳过;第二个元素是数组,调用
countArrays([1,2,3])——这个调用里sumTotal是1,遍历三个元素都不是数组,返回1,所以sumTotal变成1+1=2;第三个元素3不是数组,跳过。 - 最终返回2,和预期一致。
内容的提问来源于stack exchange,提问作者Sharon Kaufman
相关产品推荐
相关产品推荐

