fix dict to tree/nested-dict converter

This commit is contained in:
Junhan Chang
2025-09-19 04:55:05 +08:00
parent 13fd1ac572
commit f13156e792

View File

@@ -218,14 +218,20 @@ def dict_to_tree(nodes: dict, devices_only: bool = False) -> list[dict]:
# 将节点转换为字典,以便通过 ID 快速查找 # 将节点转换为字典,以便通过 ID 快速查找
nodes_list = [node for node in nodes.values() if node.get("type") == "device" or not devices_only] nodes_list = [node for node in nodes.values() if node.get("type") == "device" or not devices_only]
id_list = [node["id"] for node in nodes_list] id_list = [node["id"] for node in nodes_list]
is_root = {node["id"]: True for node in nodes_list}
# 初始化每个节点的 children 为包含节点字典的列表 # 初始化每个节点的 children 为包含节点字典的列表
for node in nodes_list: for node in nodes_list:
node["children"] = [nodes[child_id] for child_id in node.get("children", [])] node["children"] = [nodes[child_id] for child_id in node.get("children", [])]
for child_id in node.get("children", []):
if child_id in is_root:
is_root[child_id] = False
# 找到根节点并返回 # 找到根节点并返回
root_nodes = [ root_nodes = [
node for node in nodes_list if len(nodes_list) == 1 or node.get("parent", node.get("parent_name")) in [None, "", "None", np.nan] or node.get("parent", node.get("parent_name")) not in id_list node
for node in nodes_list
if is_root.get(node["id"], False) or len(nodes_list) == 1
] ]
# 如果存在多个根节点,返回所有根节点 # 如果存在多个根节点,返回所有根节点
@@ -235,6 +241,7 @@ def dict_to_tree(nodes: dict, devices_only: bool = False) -> list[dict]:
def dict_to_nested_dict(nodes: dict, devices_only: bool = False) -> dict: def dict_to_nested_dict(nodes: dict, devices_only: bool = False) -> dict:
# 将节点转换为字典,以便通过 ID 快速查找 # 将节点转换为字典,以便通过 ID 快速查找
nodes_list = [node for node in nodes.values() if node.get("type") == "device" or not devices_only] nodes_list = [node for node in nodes.values() if node.get("type") == "device" or not devices_only]
is_root = {node["id"]: True for node in nodes_list}
# 初始化每个节点的 children 为包含节点字典的列表 # 初始化每个节点的 children 为包含节点字典的列表
for node in nodes_list: for node in nodes_list:
@@ -243,14 +250,17 @@ def dict_to_nested_dict(nodes: dict, devices_only: bool = False) -> dict:
for child_id in node.get("children", []) for child_id in node.get("children", [])
if nodes[child_id].get("type") == "device" or not devices_only if nodes[child_id].get("type") == "device" or not devices_only
} }
if len(node["children"]) > 0 and node["type"].lower() == "device" and devices_only: for child_id in node.get("children", []):
if child_id in is_root:
is_root[child_id] = False
if len(node["children"]) > 0 and node["type"].lower() == "device":
node["config"]["children"] = node["children"] node["config"]["children"] = node["children"]
# 找到根节点并返回 # 找到根节点并返回
root_nodes = { root_nodes = {
node["id"]: node node["id"]: node
for node in nodes_list for node in nodes_list
if node.get("parent", node.get("parent_name")) in [None, "", "None", np.nan] or len(nodes_list) == 1 if is_root.get(node["id"], False) or len(nodes_list) == 1
} }
# 如果存在多个根节点,返回所有根节点 # 如果存在多个根节点,返回所有根节点