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

