如何根据Key递归更新树形节点及所有父节点的available值?
解决方案
核心思路
- 先给所有节点建索引映射表:把每个节点按key存进对象,同时记录每个节点的父节点key,这样找节点和父节点都能一步到位,不用反复遍历树。
- 定位到目标节点后,直接把它的
available加1。 - 顺着父节点的索引一路往上走,每个父节点的
available都加1,直到没有父节点为止。
代码实现
假设你的树形数组结构是这样的(示例):
const treeData = [ { key: 'root', available: 0, children: [ { key: 'node1', available: 0, children: [ { key: 'node1-1', available: 0 } ] }, { key: 'node2', available: 0 } ] } ];
直接用下面的函数就能实现需求:
function updateAvailable(tree, targetKey) { const nodeMap = {}; // 存所有节点,key对应节点对象 const parentMap = {}; // 存每个节点的父key // 遍历整棵树,填充两个映射表 function traverse(node, parentKey) { nodeMap[node.key] = node; if (parentKey) { parentMap[node.key] = parentKey; } // 如果有子节点,继续遍历 if (node.children?.length) { node.children.forEach(child => traverse(child, node.key)); } } // 处理所有根节点 tree.forEach(root => traverse(root)); // 找不到目标节点直接返回 const targetNode = nodeMap[targetKey]; if (!targetNode) return tree; // 更新目标节点的available targetNode.available += 1; // 向上更新所有父节点 let currentParentKey = parentMap[targetKey]; while (currentParentKey) { const parentNode = nodeMap[currentParentKey]; parentNode.available += 1; currentParentKey = parentMap[currentParentKey]; } return tree; }
示例验证
调用函数:
updateAvailable(treeData, 'node1-1');
更新后的树形结构:
[ { key: 'root', available: 1, children: [ { key: 'node1', available: 1, children: [ { key: 'node1-1', available: 1 } ] }, { key: 'node2', available: 0 } ] } ];
注意点
- 如果你的节点里不是用
children存子节点,只要把遍历里的node.children改成对应的字段就行。 - 要是目标key不存在,函数会直接返回原数组,不会报错。
内容的提问来源于stack exchange,提问作者lrr59
相关产品推荐
相关产品推荐

