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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:30:51