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

JavaScript递归函数处理多层嵌套数组无法返回完整结果的问题排查

问题描述

编写了用于处理多层深度嵌套数组的递归函数,预期功能为:从数组每一层随机选取1个元素,按照控制台打印的顺序将选中元素组合为新数组返回。但实际运行时,返回的结果数组仅包含最高层级的元素(A、B或C、D或E),未包含任何更深层级的元素。

问题相关代码
const arry = [
  ["A"],
  ["B", "C"],
  ["D", "E"],
  [
    [
      ["F1", "F2"],
      ["G1", "G2"],
      [
        "H1",
        "H2",
        [
          ["I1", "I2", "I3"],
          ["J1", "J2"],
          ["K1", "K2", "K3"],
        ],
      ],
    ],
  ],
];

function rndmElementSelection(array) {
  rndElm = array[Math.floor(Math.random() * array.length)];
  return rndElm;
}

function recursion(array, resultAry = []) {
  array.forEach((element) => {
    if (typeof element === "string") {
      console.log(element);
      resultAry.push(element);
    } else {
      nE = rndmElementSelection(element);
      if (typeof nE === "string") {
        console.log(nE);
        resultAry.push(nE);
      } else {
        recursion(nE);
      }
    }
  });
  return resultAry;
}

console.log(recursion(arry));
故障原因
  • 递归调用时未传递结果累积数组:深层执行recursion(nE)时,没有把当前上下文用来存结果的resultAry传进去。这时候深层递归会用参数默认值新建一个空数组,深层选到的元素都被push到这个临时新数组里,根本不会加到最外层调用的结果数组里,最后返回的自然只有最外层遍历到的元素。
  • 变量未做声明引发全局污染:代码里的rndElm、nE都没有用let/const声明,会直接变成全局变量,递归过程中不同层级的调用会反复覆盖这两个变量的值,很容易导致判断逻辑出错。
  • 遍历逻辑和需求不匹配:需求是每一层只随机选1个元素,但当前逻辑拿到数组后会用forEach遍历所有元素,只有进入子层级时才做随机选择,本身遍历规则就不符合设计预期。

控制台能正常打印深层元素,是因为console.log在每一层递归执行时会直接触发输出,和结果数组有没有收集到对应元素没有关系,所以才会出现打印顺序看起来正确,但返回结果缺内容的现象。

内容的提问来源于stack exchange,提问作者ham17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:24:11