如何用forEach/map等遍历嵌套对象,将所有节点的active设为false
批量设置嵌套对象所有节点的active属性为false
问题说明
给定一个层级不确定的嵌套对象结构(如下示例),需要遍历根节点及其所有子节点、孙节点,将每个节点的active属性设为false。当节点的children数组为空时,停止遍历该分支。
注:示例代码中属性拼写为
ative,建议统一修正为标准的active,避免属性不一致问题。
示例对象结构:
const obj = { name: 'obj1', active: true, children: [ { name: 'obj2', active: true, children: [ { name: 'Obj23', active: true, children: [] } ] }, { name: 'obj3', children: [ { name: 'Obj32', active: true, children: [] } ] } ] };
解决方案
方法1:递归遍历(直观简洁)
结合递归与forEach遍历所有节点,处理当前节点后递归处理子节点:
function deactivateAllNodes(node) { // 设置属性为false,兼容原拼写错误的ative node.active = false; node.ative = false; // 存在children数组时,遍历子节点递归处理 if (node.children && Array.isArray(node.children)) { node.children.forEach(child => deactivateAllNodes(child)); } } // 调用函数处理根对象 deactivateAllNodes(obj);
方法2:迭代遍历(避免栈溢出)
对于层级极深的对象,递归可能导致栈溢出,可使用队列实现迭代遍历:
function deactivateAllNodesIterative(root) { const queue = [root]; while (queue.length > 0) { const node = queue.shift(); // 设置属性为false node.active = false; node.ative = false; // 将子节点加入队列等待处理 if (node.children && Array.isArray(node.children)) { queue.push(...node.children); } } } // 调用函数处理根对象 deactivateAllNodesIterative(obj);
说明
- 两种方法均支持任意层级的嵌套对象,当节点的
children为空数组时,对应分支的遍历会自动停止 - 代码中保留了对
ative属性的处理,用于兼容原示例中的拼写错误,若已统一修正为active,可删除该行
内容的提问来源于stack exchange,提问作者Nilton Schumacher F
相关产品推荐
相关产品推荐

