基于Node值的菜单模式匹配在子节点层级的异常问题
菜单节点提取代码的特殊场景修复
问题场景
- 现有Python代码用于根据Node路径提取菜单JSON结构,例如输入
parent1.child1可返回对应层级的菜单结构 - 异常情况:当父节点仅包含单个子节点,且该子节点拥有多个子节点时,传入三级路径(如
td.aqi.test2),代码会返回该子节点下所有子项,而非指定的单个目标节点 - 临时规避方案:在父节点下新增一个空白子节点,代码即可正常返回指定内容
给定菜单结构示例
{ "menustructure": [ {"child": [], "count": 1, "header": "root", "id": "home", "Menutext": "Home", "node": "home", "path": "https:pot", "rank": "1", "target": "embedded"}, {"child": [ {"child": [ {"child": [], "node": "td.aqi.test1"}, {"child": [], "node": "td.aqi.test2"} ], "node": "td.aqi"} ], "node": "td"} ] }
核心问题分析
问题出在extract_nodes函数处理子节点的逻辑:原代码仅当过滤后的子节点数量与原数量不一致时,才会替换父节点的子节点列表。当父节点仅含单个子节点时,若该子节点的子节点过滤逻辑未触发数量差异判断,会导致父节点保留所有原有子节点,而非过滤后的目标节点。
修复方案(小范围修改)
修改extract_nodes函数中处理字典类型节点的逻辑,去掉子节点数量判断,直接将父节点的子节点替换为过滤后的结果:
def extract(data, query): return {"menustructure": extract_nodes(data["menustructure"], [x.split(".") for x in query])} def matches(name, query): name = name.split(".") for q in query: size = min(len(q), len(name)) if name[:size] == q[:size]: return True return False def extract_nodes(data, query): if isinstance(data, list): data = [extract_nodes(x, query) for x in data if matches(x["node"], query)] return [x for x in data if x is not None] if isinstance(data, dict) and matches(data["node"], query): if "child" in data: children = extract_nodes(data["child"], query) # 去掉数量判断,直接替换为过滤后的子节点 data = data.copy() data["child"] = children if not data["child"]: return None return data
测试验证
执行测试输入:
print(extract(data, ["td.aqi.test2"]))
修复后将正确返回包含td→td.aqi→td.aqi.test2的层级结构,且td.aqi的子节点仅保留td.aqi.test2。
内容的提问来源于stack exchange,提问作者vineet singh
相关产品推荐
相关产品推荐

