JavaScript递归提取数组对象name/age键值对子数组问题排查
核心问题点
- 全局变量
num、arr2存在状态污染:多次调用函数时变量不会自动重置,传入不同长度、不同内容的数组时,会出现计数错误、旧数据残留 - 递归分支无返回值:仅在
num === arr.length的终止分支返回了结果,外层递归调用没有接收、返回递归的执行结果,最终调用时大概率得到undefined - 递归逻辑耦合全局状态,函数不是纯函数,可复用性极差
修正方案
彻底移除全局变量,把递归过程中需要的计数、临时结果通过参数传递,每次递归的状态独立,不会互相干扰;所有递归分支都保证正确返回最终结果。
写法1:参数默认值实现(最简洁)
function collectNameAge(arr, currentIndex = 0, res = []) { // 终止条件:遍历完所有项,返回收集的结果 if (currentIndex === arr.length) return res; // 收集当前项的name、age res.push([arr[currentIndex].name, arr[currentIndex].age]); // 索引+1继续递归,必须return递归调用的返回值,否则外层拿不到结果 return collectNameAge(arr, currentIndex + 1, res); } // 测试 const testArr = [ {name:'mike', age:22}, {name:'robert', age:12}, {name:'roger', age:44}, {name:'peter', age:28}, {name:'Ralph', age:67} ]; console.log(collectNameAge(testArr)); // 输出:[ [ 'mike', 22 ], [ 'robert', 12 ], [ 'roger', 44 ], [ 'peter', 28 ], [ 'Ralph', 67 ] ]
注:你写的期望输出里字符串值漏了引号,属于书写笔误,实际返回的是标准JS字符串类型,符合预期。
写法2:闭包内层递归实现(对外只暴露数组参数)
如果不想让调用者感知到计数、结果参数,可以把递归逻辑写在函数内部,用闭包保存状态:
function collectNameAge(arr) { const res = []; // 内层递归函数只负责遍历 function traverse(index) { if (index === arr.length) return; res.push([arr[index].name, arr[index].age]); traverse(index + 1); } traverse(0); return res; }
内容的提问来源于stack exchange,提问作者kilnerbank
相关产品推荐
相关产品推荐

