Проблема в том, что структура может быть расширена до родительского1.ребенок1.суб-ребенок1, но если родитель1 имеет только один дочерний элемент и этот дочерний элемент имеют несколько дочерних элементов, тогда, если я передам шаблон родительский1.ребенок1.суб-детский1, он вернет все дочерние элементы из главного меню, и если я создам новый пустой дочерний элемент2 под родительским элементом без какого-либо кода дочернего элемента, он будет работать так, как задумано, и вернуть правильный вывод.
структура главного меню
Код: Выделить всё
{
"menustructure": [
{
"child": [],
"count": 1,
"header": "root",
"id": "home",
"Menutext": "Home",
"node": "home",
"path": "https:pot",
"rank": "1",
"target": "embedded"
},
{
"child": [
{
"body": "toggle",
"count": 33,
"id": "configuration",
"Menutext": "Configuration",
"node": "Admin.configuration",
"path": "/dc",
"rank": "1",
"child": [
{
"body": "toggle",
"count": 54,
"id": "a",
"Menutext": "A",
"node": "Admin.configuration.a",
"path": "hdc",
"rank": "1",
"target": "embedded"
},
{
"body": "toggle",
"count": 54,
"id": "b",
"Menutext": "B",
"node": "Admin.configuration.b",
"path": "hcd",
"rank": "1",
"target": "embedded"
},
{
"body": "toggle",
"count": 54,
"id": "c",
"Menutext": "C",
"node": "Admin.configuration.c",
"path": "hdc",
"rank": "1",
"target": "embedded"
},
{
"body": "toggle",
"count": 54,
"id": "d",
"Menutext": "D",
"node": "Admin.configuration.d",
"path": "hcd",
"rank": "1",
"target": "embedded"
}
]
},
{
"body": "toggle",
"count": 34,
"id": "roles",
"Menutext": "Roles",
"node": "Admin.roles",
"path": "/poter/admin/roles",
"rank": "2"
},
{
"body": "toggle",
"count": 35,
"id": "menu",
"Menutext": "Menu",
"node": "Admin.menu",
"path": "/poter/admin/menu",
"rank": "3"
},
{
"body": "toggle",
"count": 36,
"id": "rmm",
"Menutext": "RMM",
"node": "Admin.rmm",
"path": "/poter/admin/rmm",
"rank": "4"
},
{
"body": "toggle",
"count": 37,
"id": "userroles",
"Menutext": "URS",
"node": "Admin.userroles",
"path": "/poter/admin/userrol",
"rank": "5"
},
{
"body": "toggle",
"count": 38,
"id": "logs",
"Menutext": "Logs",
"node": "Admin.logs",
"path": "/poter/admin/logs",
"rank": "5"
}
],
"count": 2,
"header": "root",
"id": "admin",
"Menutext": "Admin",
"node": "Admin",
"path": "admin",
"rank": "2",
"target": ""
},
{
"child": [],
"count": 3,
"header": "root",
"id": "dc",
"Menutext": "dc",
"node": "dc",
"path": "dc",
"rank": "2",
"target": "embedded"
},
{
"child": [
{
"body": "toggle",
"count": 39,
"id": "Tickets",
"Menutext": "Tickets",
"node": "l.Tickets",
"path": "https:l",
"rank": "1",
"target": "embedded"
}
],
"count": 4,
"header": "root",
"id": "l",
"Menutext": "L",
"node": "l",
"path": "l",
"rank": "2",
"target": ""
},
{
"child": [],
"count": 5,
"header": "root",
"id": "fu",
"Menutext": "Fu",
"node": "fu",
"path": "/poter/fu",
"rank": "2"
},
{
"child": [],
"count": 6,
"header": "root",
"id": "testingk",
"Menutext": "testingk",
"node": "testingk",
"path": "/poter",
"rank": "2"
},
{
"child": [],
"count": 7,
"header": "root",
"id": "ql",
"Menutext": "sf",
"node": "ql",
"path": "ql",
"rank": "2",
"target": "embedded"
},
{
"child": [],
"count": 8,
"header": "root",
"id": "mp",
"Menutext": "mp",
"node": "mp",
"path": "mp",
"rank": "3",
"target": ""
},
{
"child": [
{
"body": "toggle",
"child": [
{
"id": "test",
"Menutext": "test",
"node": "td.aqi.test",
"path": "https",
"rank": "1",
"target": "embedded"
},
{
"id": "test2",
"Menutext": "test2",
"node": "td.aqi.test2",
"path": "https",
"rank": "1",
"target": "embedded"
},
{
"id": "test3",
"Menutext": "test3",
"node": "td.aqi.test3",
"path": "https",
"rank": "1",
"target": "embedded"
}
],
"count": 40,
"id": "aqi",
"Menutext": "rm",
"node": "td.aqi",
"path": "https",
"rank": "1",
"target": "embedded"
}# ,
# {
# "count": 40,
# "id": "mr",
# "Menutext": "mr",
# "node": "td.mr",
# "path": "https",
# "rank": "1",
# "target": "embedded",
# "child": []
# }
],
"count": 9,
"header": "root",
"id": "td",
"Menutext": "TD",
"node": "td",
"path": "/poter/td",
"rank": "4",
"target": ""
},
{
"child": [
{
"body": "toggle",
"child": [
{
"body": "toggle",
"count": 54,
"id": "deku",
"Menutext": "deku",
"node": "rep.ops.deku",
"path": "https",
"rank": "1",
"target": "embedded"
},
{
"body": "toggle",
"count": 55,
"id": "kalo",
"Menutext": "kalo",
"node": "rep.ops.kalo",
"path": "https",
"rank": "2",
"target": "embedded"
},
{
"body": "toggle",
"count": 56,
"id": "aa",
"Menutext": "aa",
"node": "rep.ops.aa",
"path": "https",
"rank": "3",
"target": "embedded"
},
{
"body": "toggle",
"count": 57,
"id": "himi",
"Menutext": "himi",
"node": "rep.ops.himi",
"path": "https",
"rank": "4",
"target": "embedded"
},
{
"id": "baku",
"Menutext": "baku",
"node": "reports.ops.baku",
"path": "https",
"rank": "5",
"target": "embedded"
}
],
"count": 53,
"id": "ops",
"Menutext": "ps",
"node": "rep.ops",
"path": "/poter/rep/ps",
"rank": "1",
"target": ""
}
],
"count": 13,
"header": "root",
"id": "rep",
"Menutext": "rep",
"node": "rep",
"path": "/poter/rep",
"rank": "11",
"target": ""
}
]
}
Код: Выделить всё
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))
print(size)
if name[:size] == q[:size]:
print(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)
# print(children)
if len(children) != len(data["child"]):
print()
data = data.copy() # copy-on-write
data["child"] = children
if not data["child"]:
return None
return data
Код: Выделить всё
print(extract(data, ["td.aqi.test2"]))
Но если мы раскомментируем закомментированную часть в masterjson и запустим код, он будет работать так, как задумано.
Примечание: я не могу сделать некоторые большие изменения в коде или замените код чем-то новым до тех пор, пока это невозможно, поскольку этот код не работает только для этого особого случая.
Подробнее здесь: https://stackoverflow.com/questions/790 ... f-child-no