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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 19:27:03