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
相关产品推荐
相关产品推荐

