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

递归函数生成大量子节点副本问题排查与修复

递归删除父子节点函数的重复节点问题及解决办法

我尝试编写一个基于父子关系递归删除节点的函数,初始代码如下:

function recursiveDelete(parentNode, deleteStack) {
    let toDelete = allNodes.filter(function (node) {
      return node.Parent !== undefined && node.Parent[0] === parentNode.ID;
    })

    toDelete.forEach((childNode) => {
      deleteStack.push(...recursiveDelete(childNode, toDelete));
    });

  return deleteStack;
}

运行该代码后,生成的待删除节点数组中存在大量重复节点,重复次数与树的高度相关,虽能运行但效率不佳。以下是返回结果示例(包含重复节点):

[
    {
        "ID": "recymaQKcdrGzAqRM",
        "Name": "Depth 1",
        "Type": "task",
        "Duration": 0.1,
        "Priority": "6",
        "Parent": [
            "recQT9BPQtqs7Cg0U"
        ],
        "Predecessors": [
            "recKwlRnVhKik3SZF"
        ],
        "depth": 2
    },
    {
        "ID": "recRcn1t2Nkupcb9L",
        "Name": "Start",
        "Type": "start",
        "Duration": 0.1,
        "Priority": "5",
        "Parent": [
            "recymaQKcdrGzAqRM"
        ]
    },
    {
        "ID": "recBmEBC1bo1CcJ8i",
        "Name": "Depth 2",
        "Type": "task",
        "Duration": 0.1,
        "Priority": "5",
        "Parent": [
            "recymaQKcdrGzAqRM"
        ],
        "Predecessors": [
            "recRcn1t2Nkupcb9L"
        ]
    },
    {
        "ID": "recRcn1t2Nkupcb9L",
        "Name": "Start",
        "Type": "start",
        "Duration": 0.1,
        "Priority": "5",
        "Parent": [
            "recymaQKcdrGzAqRM"
        ]
    },
    {
        "ID": "recBmEBC1bo1CcJ8i",
        "Name": "Depth 2",
        "Type": "task",
        "Duration": 0.1,
        "Priority": "5",
        "Parent": [
            "recymaQKcdrGzAqRM"
        ],
        "Predecessors": [
            "recRcn1t2Nkupcb9L"
        ]
    },
    {
        "ID": "rec7qUgu7kpnQ06s7",
        "Name": "Start",
        "Type": "start",
        "Duration": 0.1,
        "Priority": "5",
        "Parent": [
            "recBmEBC1bo1CcJ8i"
        ]
    },
    {
        "ID": "rec5Lyx3zuAsCPv9W",
        "Name": "Depth 3",
        "Type": "task",
        "Duration": 0.1,
        "Priority": "5",
        "Parent": [
            "recBmEBC1bo1CcJ8i"
        ],
        "Predecessors": [
            "rec7qUgu7kpnQ06s7"
        ]
    },
    {
        "ID": "rec7qUgu7kpnQ06s7",
        "Name": "Start",
        "Type": "start",
        "Duration": 0.1,
        "Priority": "5",
        "Parent": [
            "recBmEBC1bo1CcJ8i"
        ]
    },
    {
        "ID": "rec5Lyx3zuAsCPv9W",
        "Name": "Depth 3",
        "Type": "task",
        "Duration": 0.1,
        "Priority": "5",
        "Parent": [
            "recBmEBC1bo1CcJ8i"
        ],
        "Predecessors": [
            "rec7qUgu7kpnQ06s7"
        ]
    }
]

我最初用去重的方式临时解决:

[...new Set(recursiveDelete(allNode, [allNode]))]

但我希望找到问题根源彻底解决。后来发现问题出在递归调用时传入了toDelete,正确的做法应该是传入[childNode]。修正后的代码如下:

function recursiveDelete(parentNode, deleteStack) {
  let toDelete = allNodes.filter(function (node) {
    return node.Parent !== undefined && node.Parent[0] === parentNode.ID;
  });

  toDelete.forEach((childNode) => {
    deleteStack.push(...recursiveDelete(childNode, [childNode]));
  });

  return deleteStack;
}

内容的提问来源于stack exchange,提问作者Sam Gates

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:55:27