编写含递归与三元运算符的deepCount函数,统计嵌套数组元素总数并解释
实现deepCount递归函数:统计数组及嵌套数组总元素数
需求说明
编写deepCount函数,返回数组中所有元素(包括嵌套数组自身)的总数量,要求必须使用递归和三元运算符实现。
测试用例及预期输出
console.log(deepCount([])); // 0 console.log(deepCount([1, 2, 3])); // 3 console.log(deepCount(["x", "z", ["y"]])); // 4 console.log(deepCount([1, 2, [3, 4, [5]]])); //7 console.log(deepCount([[[[]]]])); //3
现有错误代码分析
先看这段有问题的实现:
let arr = [1, 2, [3, 4[5]]]; // 语法错误:4后面缺少逗号,应为[3,4,[5]] function deepCount(arr) { let result = arr.length; for (const char of arr) { if (Array.isArray(arr[char])) { // 错误:char是元素不是索引,应直接判断char本身 result += arr[char]; // 错误:直接累加数组对象,而非嵌套数组的元素数量 deepCount(arr); // 错误:递归调用未接收返回值,无法获取嵌套数组的统计结果 } return result; // 错误:循环第一次迭代就返回,后续元素完全未处理 }; }
这段代码的核心问题:
- 数组定义存在语法错误
- 遍历逻辑错误:
for...of拿到的是元素,却用它当索引取arr[char] - 递归调用无效:既没接收递归返回的嵌套数组数量,也没正确累加
- 提前返回:循环只执行一次就return,无法遍历所有元素
正确实现(递归+三元运算符)
function deepCount(arr) { // 当前数组直接元素数 + 所有嵌套数组的元素总数 return arr.length + arr.reduce((total, elem) => total + (Array.isArray(elem) ? deepCount(elem) : 0), 0 ); }
实现逻辑详解
- 基础数量计算:
arr.length是当前数组的直接元素数量(包括嵌套数组本身,比如["x", ["y"]]的length为2,这2个元素都要计入总数) - 递归处理嵌套结构:
- 用
reduce遍历当前数组的每个元素,累加嵌套数组的贡献值 - 对每个元素
elem,通过三元运算符判断:如果是数组,就递归调用deepCount(elem)得到这个嵌套数组的总元素数;如果不是数组,贡献值为0
- 用
- 总和计算:当前数组的直接元素数 + 所有嵌套数组的总元素数,即为最终统计结果
关键测试用例验证
deepCount([[[[]]]]):最外层数组length=1,里面的[[]]是数组,递归调用得2(自身length=1 + 内层[]的length=1),1+2=3,符合预期deepCount([1,2,[3,4,[5]]]):外层length=3,嵌套数组[3,4,[5]]的总数量是4(自身length=3 + 内层[5]的数量1),3+4=7,符合预期
内容的提问来源于stack exchange,提问作者strawberry
相关产品推荐
相关产品推荐

