递归函数生成大量子节点副本问题排查与修复
递归删除父子节点函数的重复节点问题及解决办法
我尝试编写一个基于父子关系递归删除节点的函数,初始代码如下:
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
相关产品推荐
相关产品推荐

