
点击查看代码
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)继续查找下一部分
-
特殊处理:
- 当删除子节点后,如果该节点没有其他子节点了,会连这个空节点一起删除
- 整个过程是递归进行的,从顶层一直找到最深层的目标节点
-
最终返回一个结果,表示当前节点集合中是否还有剩余节点
简单说,就像在文件夹中删除一个深层文件,如果删除后父文件夹变空了,会连父文件夹一起删掉。
