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

JavaScript遍历嵌套对象数组,设置internalChecked为false失败求助

问题分析

你的代码执行后没得到预期的树形结构结果,核心问题出在这几点:

  • 全局的outPut数组会把所有节点扁平化存储,直接破坏了原有的树形层级,最终输出是一维数组而非嵌套的树形结构
  • 遍历子节点时,你只是把子节点单独push到outPut,没有将它们关联到对应父节点的internalChildren属性中
  • savedIndex属于冗余变量,全程没有实际作用
修正方案

我们需要递归遍历每个节点,修改internalChecked为false的同时,完整保留原树形结构。下面提供两种常用方案:

方案1:原地修改原树形结构

适合不需要保留原始数据的场景,直接修改原对象:

function traverseTree(nodes) {
  nodes.forEach(node => {
    // 修改当前节点的状态
    node.internalChecked = false;
    // 存在子节点则递归处理
    if (node.internalChildren && node.internalChildren.length > 0) {
      traverseTree(node.internalChildren);
    }
  });
}

// 调用函数修改原数据
traverseTree(json);
console.log(json);

方案2:深拷贝后修改(不影响原数据)

如果需要保留原始数据,可以先深拷贝树形结构,再进行修改:

function deepCopyAndUncheck(nodes) {
  return nodes.map(node => {
    // 浅拷贝当前节点属性
    const copiedNode = { ...node };
    // 修改目标属性
    copiedNode.internalChecked = false;
    // 递归处理子节点并替换
    if (copiedNode.internalChildren && copiedNode.internalChildren.length > 0) {
      copiedNode.internalChildren = deepCopyAndUncheck(copiedNode.internalChildren);
    }
    return copiedNode;
  });
}

// 得到修改后的新树形结构,原数据不受影响
const updatedJson = deepCopyAndUncheck(json);
console.log(updatedJson);
原代码失效的核心原因

原代码里你把每个节点(包括子节点)都直接push到全局outPut数组,这会让所有节点处于同一层级,完全丢失了原有的父子嵌套关系。比如原数据中Steel的子节点Cars,在你的输出里会和Steel并列,而非作为Steel的internalChildren存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:27:30