一朋友给了这么个需求,类似分类文件夹,文件夹下面又可以创建子文件夹,子文件夹下面还能创建文件夹。
在通过前台查询的时候,后台返回的数据,要展示成层级嵌套的格式,如下面的格式。
后台通过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'}基本满足了要求。