一朋友给了这么个需求,类似分类文件夹,文件夹下面又可以创建子文件夹,子文件夹下面还能创建文件夹。
在通过前台查询的时候,后台返回的数据,要展示成层级嵌套的格式,如下面的格式。
后台通过sql查询的的数据结构为
a=[
{"id": 1, "text": "a1", "parentId": "0"},
{"id": 2, "text": "a1-1", "parentId": "1"},
{"id": 3, "text": "a1-2", "parentId": "1"},
{"id": 4, "text": "a1-3", "parentId": "1"},
{"id": 5, "text": "a2", "parentId": "0"},
{"id": 6, "text": "a2-1", "parentId": "5"},
{"id": 7, "text": "a2-2", "parentId": "5"},
{"id": 8, "text": "a2-3", "parentId": "5"},
{"id": 9, "text": "a2-1-1", "parentId": "6"},
{"id": 10, "text": "a2-1-2", "parentId": "6"},
{"id": 10, "text": "a2-2-2", "parentId": "6"},
{"id": 11, "text": "a3", "parentId": "0"},
{"id": 12, "text": "a3-1", "parentId": "5"},
]
这样就要将这些数据做处理,让子文件夹数据嵌套在主文件夹里面,嵌套后的格式为
{'text': 'a2', 'children': [{'text': 'a2-1', 'children': [{'text': 'a2-1-1', 'id': 9, 'parentId': '6'}, {'text': 'a2-1-2', 'id': 10, 'parentId': '6'}], 'id': 6, 'parentId': '5'}, {'text': 'a2-2', 'children': [{'text': 'a2-2-2', 'id': 10, 'parentId': '6'}], 'id': 7, 'parentId': '5'}, {'text': 'a2-3', 'children': [], 'id': 8, 'parentId': '5'}], 'id': 5, 'parentId': '0'}
思路:前端控制,层级最多三级,先将三级的数据插入到二级,再将二级的写入到一级,具体代码如下(只求实现,没有注意写法格式和做优化,以后有时间再弄)
a=[
{"id": 1, "text": "a1", "parentId": "0"},
{"id": 2, "text": "a1-1", "parentId": "1"},
{"id": 3, "text": "a1-2", "parentId": "1"},
{"id": 4, "text": "a1-3", "parentId": "1"},
{"id": 5, "text": "a2", "parentId": "0"},
{"id": 6, "text": "a2-1", "parentId": "5"},
{"id": 7, "text": "a2-2", "parentId": "5"},
{"id": 8, "text": "a2-3", "parentId": "5"},
{"id": 9, "text": "a2-1-1", "parentId": "6"},
{"id": 10, "text": "a2-1-2", "parentId": "6"},
{"id": 10, "text": "a2-2-2", "parentId": "6"},
{"id": 11, "text": "a3", "parentId": "0"},
{"id": 12, "text": "a3-1", "parentId": "5"},
]
"先分组"
teams=[]
for i in a:
if i['parentId']=='0':
teams.append(a.index(i))
# teams.append(10000000)
"每次取两个数值出来"
for i in teams:
if i==teams[-1]:
value = a[i:]
else:
value = a[i:teams[teams.index(i) + 1]] # 需要处理的集合,里面包含了完整的一个
# print value
"list中分组,把同组的先归类到一起"
for i in value:
if i['parentId']=='0':
i['children']=[]
'循环第一层'
folder_2=[]
folder_3=[]
for i in value:
if i['text'].count('-')==1:
folder_2.append(i)
elif i['text'].count('-')==2:
folder_3.append(i)
if folder_3 != []:
"根据三级菜单信息,插入对应的二级"
for i in folder_2:
i['children']=[]
for j1 in folder_3:
if j1['text'][:4]==i['text']:
i['children'].append(j1)
# print folder_2
"把二级写到一级"
print 'f',folder_2
print 'v',value[0]
value[0]['children']=folder_2
print value[0]
输出的内容为
f [{'text': 'a1-1', 'id': 2, 'parentId': '1'}, {'text': 'a1-2', 'id': 3, 'parentId': '1'}, {'text': 'a1-3', 'id': 4, 'parentId': '1'}]
v {'text': 'a1', 'children': [], 'id': 1, 'parentId': '0'}
{'text': 'a1', 'children': [{'text': 'a1-1', 'id': 2, 'parentId': '1'}, {'text': 'a1-2', 'id': 3, 'parentId': '1'}, {'text': 'a1-3', 'id': 4, 'parentId': '1'}], 'id': 1, 'parentId': '0'}
f [{'text': 'a2-1', 'children': [{'text': 'a2-1-1', 'id': 9, 'parentId': '6'}, {'text': 'a2-1-2', 'id': 10, 'parentId': '6'}], 'id': 6, 'parentId': '5'}, {'text': 'a2-2', 'children': [{'text': 'a2-2-2', 'id': 10, 'parentId': '6'}], 'id': 7, 'parentId': '5'}, {'text': 'a2-3', 'children': [], 'id': 8, 'parentId': '5'}]
v {'text': 'a2', 'children': [], 'id': 5, 'parentId': '0'}
{'text': 'a2', 'children': [{'text': 'a2-1', 'children': [{'text': 'a2-1-1', 'id': 9, 'parentId': '6'}, {'text': 'a2-1-2', 'id': 10, 'parentId': '6'}], 'id': 6, 'parentId': '5'}, {'text': 'a2-2', 'children': [{'text': 'a2-2-2', 'id': 10, 'parentId': '6'}], 'id': 7, 'parentId': '5'}, {'text': 'a2-3', 'children': [], 'id': 8, 'parentId': '5'}], 'id': 5, 'parentId': '0'}
f [{'text': 'a3-1', 'id': 12, 'parentId': '5'}]
v {'text': 'a3', 'children': [], 'id': 11, 'parentId': '0'}
{'text': 'a3', 'children': [{'text': 'a3-1', 'id': 12, 'parentId': '5'}], 'id': 11, 'parentId': '0'}
基本满足了要求。