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

JavaScript递归干扰嵌套数组for循环遍历的问题排查

递归遍历嵌套数组时无限循环的原因及修复方案

你的猜测完全正确,问题核心就是循环变量i的作用域问题。

问题根源

代码里的i没有用let/var声明,导致它成为了全局变量。当递归调用loop_checker时,内层函数的循环会直接修改这个全局的i值:

  • 外层循环执行到i=4(对应测试数组里的子数组),进入递归
  • 内层循环的i从0开始计数,递归结束后,全局i已经变成了3(内层数组长度为3,循环结束时i等于3)
  • 回到外层循环,i继续自增到4,又会重复处理第5个元素,最终陷入无限循环

修复方案

只需要给循环里的i加上let声明,把它限定在当前函数的作用域内,这样递归时内层的i和外层的i互不干扰:

function loop_checker(background_check) {
    let loop_condition = false
    let count = background_check.length
    // 用let声明i,将作用域限定在当前循环和函数内
    for (let i=0;i<count;i++) {
        if (typeof background_check[i] === 'object') {
            let x = loop_checker(background_check[i])
            if (x === true) {
                loop_condition = true
            }
        }
        else if (background_check[i] === 0) {
            loop_condition = true
        }
    }
    return loop_condition
}

额外优化(可选)

一旦找到0就可以提前返回,不用继续遍历,提升函数效率:

function loop_checker(background_check) {
    let count = background_check.length
    for (let i=0;i<count;i++) {
        const current = background_check[i];
        if (typeof current === 'object') {
            // 递归找到0直接返回true
            if (loop_checker(current)) {
                return true;
            }
        } else if (current === 0) {
            // 找到0立即终止遍历返回
            return true;
        }
    }
    // 遍历完未找到0,返回false
    return false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:56:01