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

JavaScript递归遍历嵌套JSON修改键值时children遍历异常如何解决?

问题原因

你的代码核心错误出在children遍历的循环条件上:
原来的代码写的是for (let i = 0; i < entry.length; i++),这里的entry是Object.entries(instancias)返回的每一项,结构固定为[key, value],所以entry.length永远是2,也就是说你最多只会遍历children数组的前2个元素,当children长度大于2时会漏遍历,当children长度小于2时,访问value[i]就会得到undefined,递归传入undefined自然会出现异常。

修复方案

把循环条件改为取children数组本身的长度即可,同时可以简化代码逻辑,不需要遍历所有属性,直接访问指定字段即可,优化后的代码如下:

jsonAdapter(instancias: any) {
    // 直接处理recursoId相关字段,不需要遍历所有属性
    if (instancias.recursoId) {
        // 这里补充你原来对recursoId、tipoRecurso、propietario的处理逻辑
        // 比如取值、修改字段都可以直接操作,不需要嵌套forEach
        const tipoRecurso = instancias.recursoId.tipoRecurso;
        const propietario = instancias.recursoId.propietario;
        // 你的原有处理逻辑写在这里...
    }
    // 处理children递归
    if (instancias.children && instancias.children.length > 0) {
        // 遍历children数组所有元素
        for (let i = 0; i < instancias.children.length; i++) {
            this.jsonAdapter(instancias.children[i]);
        }
    }
}

如果你要保留原来的遍历写法,只需要把循环条件改对即可:

if ((key === 'children') && value) {
  // 把entry.length改成value.length
  for (let i = 0; i < value.length; i++) {
    this.jsonAdapter(value[i]);
  }
}

额外优化建议

  • 你原来嵌套多层Object.entries遍历没有实际意义,直接通过对象属性访问符.就能拿到对应字段的值,不需要遍历所有属性判断key,性能更高代码也更易读
  • 可以增加非空判断,避免传入undefined或者null的时候报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:06:03