1. 程式人生 > >python 後臺資料以層級形式傳遞給前臺

python 後臺資料以層級形式傳遞給前臺

一朋友給了這麼個需求,類似分類資料夾,資料夾下面又可以建立子資料夾,子資料夾下面還能建立資料夾。

在通過前臺查詢的時候,後臺返回的資料,要展示成層級巢狀的格式,如下面的格式。

後臺通過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'}
基本滿足了要求。