定义菜单树类结构
from functools import reduce
class MenuTree():
def __init__(self, tree, primary_key='id', parent_key='parent_id', label='children', parent_label='parent'):
self.tree = tree
self.primary_key = primary_key
self.parent_key = parent_key
self.label = label
self.parent_label = parent_label
def __to_tree_dict(self):
def allocate_node(cur_node, new_node):
cur_node[new_node.get(self.primary_key)] = new_node
return cur_node
info = reduce(allocate_node, self.tree, {})
return info
def __to_parent_tree_dict(self):
def allocate_node(cur_node, new_node):
cur_node[new_node.get(self.primary_key)] = new_node
new_node[self.parent_label] = []
return cur_node
info = reduce(allocate_node, self.tree, {})
return info
def from_list(self):
def __tree_filter(node):
if node.get(self.parent_key) and info.get(node.get(self.parent_key)):
children = info[node.get(self.parent_key)].get(self.label, [])
children.append(node)
info[node.get(self.parent_key)].update({
self.label: children
})
return not node.get(self.parent_key)
info = self.__to_tree_dict()
self.tree = list(filter(lambda x: __tree_filter(x), self.tree))
def from_parent_list(self):
def __tree_filter(node):
if node.get(self.parent_key) and info.get(node.get(self.parent_key)):
node.get(self.parent_label).append(info[node.get(self.parent_key)])
return True
info = self.__to_parent_tree_dict()
self.tree = list(filter(lambda x: __tree_filter(x), self.tree))
生成树结构
menus=[
{
"id":1,
"parent_id":None
},
{
"id":2,
"parent_id":1
}
]
menu_tree = MenuTree(menus)
menu_tree.from_list()
print(menu_tree.tree)