
点击查看代码
def clean_node(nodes, full_name):
names = full_name.split('.')
current_name = names[0]
for i, node in enumerate(nodes):
assert isinstance(node, dict)
if node.get('name') != current_name:
continue
# 如果是路径的最后一个节点,移除相应的节点
if len(names) == 1:
del nodes[i]
break # 不继续往下找了
# 如果不是最后一个节点,深入子节点
children = node.get('routes', [])
if not children:
break
# 移除并检查是否也应该移除父字典
has_nodes = clean_node(children, '.'.join(names[1:]))
if not has_nodes:
del nodes[i]
return any(x.get('name') for x in nodes)
-
首先把要删除的完整路径(比如"datafilling.double-first-class")按点分割成多个部分(如["datafilling", "double-first-class"])
-
从路由树的顶层开始查找:
- 先找和第一部分名称匹配的节点
- 如果这是最后一个要查找的部分,直接删除这个节点
- 如果不是最后一部分,就进入该节点的子路由(routes)继续查找下一部分
-
特殊处理:
- 当删除子节点后,如果该节点没有其他子节点了,会连这个空节点一起删除
- 整个过程是递归进行的,从顶层一直找到最深层的目标节点
-
最终返回一个结果,表示当前节点集合中是否还有剩余节点
简单说,就像在文件夹中删除一个深层文件,如果删除后父文件夹变空了,会连父文件夹一起删掉。
浙公网安备 33010602011771号