1)递归将列表转化成树
2)递归获取选中节点树
# 城市列表
data = [
{"id":1,"name":"浙江","upperid":None},
{"id":2,"name":"江苏","upperid":None},
{"id":3,"name":"福建","upperid":None},
{"id":11,"name":"杭州","upperid":1},
{"id":12,"name":"嘉兴","upperid":1},
{"id":21,"name":"苏州","upperid":2},
{"id":22,"name":"无锡","upperid":2},
{"id":31,"name":"福州","upperid":3},
{"id":32,"name":"厦门","upperid":3},
{"id":111,"name":"萧山","upperid":11},
{"id":112,"name":"临安","upperid":11},
{"id":121,"name":"嘉善","upperid":12},
{"id":122,"name":"桐乡","upperid":12},
{"id":211,"name":"吴江","upperid":21},
{"id":212,"name":"常熟","upperid":21}
]
# 根据城市列表,递归获取城市树
def get_tree(data):
tree_data=[]
for node in [node for node in data if node['upperid'] == None]:
node['path']=[]
node['path'].append(node['id'])
node['children']=[]
tree_data.append(node)
get_children(node,data)
return tree_data
def get_children(upper_node,data):
res = [node for node in data if node['upperid'] == upper_node['id']]
if len(res)>0:
for node in res:
node['path']=[]
node['path'].extend(upper_node['path'])
node['path'].append(node['id'])
node['children']=[]
upper_node['children'].append(node)
get_children(node,data)
# 获取选中节点树(包括父节点)
def get_selected_tree(tree,ids):
new_tree=[]
for root_node in tree:
is_keep=is_node_keep(root_node,ids)
if is_keep==True:
new_tree.append(root_node)
return new_tree
def is_node_keep(node,ids):
is_keep=False
if node['id'] in ids:
is_keep=True
if len(node['children']):
new_children=[]
for child_node in node['children']:
is_child_keep=is_node_keep(child_node,ids)
if is_child_keep==True:
new_children.append(child_node)
if len(new_children)>0:
is_keep=True
node['children']=new_children
return is_keep
# 调用递归方法
print('城市树结构')
tree=get_tree(data)
print(tree)
print('选中城市(杭州、嘉善、吴江)')
ids=[11, 121, 211]
new_tree=get_selected_tree(tree,ids)
print(new_tree)
全树json效果
[{
"id": 1,
"name": "浙江",
"upperid": "",
"path": [1],
"children": [{
"id": 11,
"name": "杭州",
"upperid": 1,
"path": [1, 11],
"children": [{
"id": 111,
"name": "萧山",
"upperid": 11,
"path": [1, 11, 111],
"children": []
}, {
"id": 112,
"name": "临安",
"upperid": 11,
"path": [1, 11, 112],
"children": []
}]
}, {
"id": 12,
"name": "嘉兴",
"upperid": 1,
"path": [1, 12],
"children": [{
"id": 121,
"name": "嘉善",
"upperid": 12,
"path": [1, 12, 121],
"children": []
}, {
"id": 122,
"name": "桐乡",
"upperid": 12,
"path": [1, 12,
122
],
"children": []
}]
}]
}, {
"id": 2,
"name": "江苏",
"upperid": "",
"path": [2],
"children": [{
"id": 21,
"name": "苏州",
"upperid": 2,
"path": [2, 21],
"children": [{
"id": 211,
"name": "吴江",
"upperid": 21,
"path": [2, 21, 211],
"children": []
}, {
"id": 212,
"name": "常熟",
"upperid": 21,
"path": [2, 21, 212],
"children": []
}]
}, {
"id": 22,
"name": "无锡",
"upperid": 2,
"path": [2, 22],
"children": []
}]
}, {
"id": 3,
"name": "福建",
"upperid": "",
"path": [3],
"children": [{
"id": 31,
"name": "福州",
"upperid": 3,
"path": [3, 31],
"children": []
}, {
"id": 32,
"name": "厦门",
"upperid": 3,
"path": [3, 32],
"children": []
}]
}]
获取选中节点树(包括父节点)
[{
"id": 1,
"name": "浙江",
"upperid": "",
"path": [1],
"children": [{
"id": 11,
"name": "杭州",
"upperid": 1,
"path": [1, 11],
"children": []
}, {
"id": 12,
"name": "嘉兴",
"upperid": 1,
"path": [1, 12],
"children": [{
"id": 121,
"name": "嘉善",
"upperid": 12,
"path": [1, 12, 121],
"children": []
}]
}]
}, {
"id": 2,
"name": "江苏",
"upperid": "",
"path": [2],
"children": [{
"id": 21,
"name": "苏州",
"upperid": 2,
"path": [2, 21],
"children": [{
"id": 211,
"name": "吴江",
"upperid": 21,
"path": [2, 21, 211],
"children": []
}]
}]
}]