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

如何根据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:48:28