分级菜单的简单逻辑

个人感觉这个逻辑不错,就分享吧

分级菜单的实现其实就是一个儿子找爸爸的过程:

准备数据:

from django.test import TestCase
from django.shortcuts import HttpResponse


# Create your tests here.
def test(request):
    # menu_list
    menu_list = {
        1: {"name": "菜单1", "status": False, 'child': [], "parent_id": None},  #这是真爸爸,没有父亲的祖宗
        2: {"name": "菜单2", "status": False, 'child': [], "parent_id": 1},      #这是个伪爸爸
        3: {"name": "菜单3", "status": False, 'child': [], "parent_id": 2}    #这也是

    }
    # item_list
    item_list = [
        {"name": "item1", "status": True, "parent_id": 1,"child":[]},   #儿子们
        {"name": "item2", "status": True, "parent_id": 1,"child":[]},
        {"name": "item3", "status": True, "parent_id": 1,"child":[]},
    ]
    # 目的把item1,2,3,菜单2,放到menu_list 菜单一下面,菜单3放到菜单2下面
    #效果如下:
    # 菜单1
    # ---- item1
    # ---- item2
    # ---- item3
    # ---- 菜单2
    # -------- 菜单3

首先对儿子们数据重新整理,一个爸爸的分一组:

# 加工item_list:同一个爸爸站一组
    son_dict = {}
    for item in item_list:
        if item["parent_id"] in son_dict:
            son_dict[item["parent_id"]].append(item)
        else:
            son_dict[item["parent_id"]] = [item, ]
    # print(son_dict)

结果:1 爸爸里面有三个儿子

{1: [{'name': 'item1', 'status': True, 'parent_id': 1, 'child': []}, {'name': 'item2', 'status': True, 'parent_id': 1, 'child': []}, {'name': 'item3', 'status': Tru
e, 'parent_id': 1, 'child': []}]}

找到爸爸:

    for k,v in son_dict.items():
        menu_list[k]['child']=v    #上面的组放进爸爸child里面
        menu_list[k]['status']=True
    print(menu_list)

结果:1爸爸里面child 有3个儿子

{1: {'name': '菜单1', 'status': True, 'child': [{'name': 'item1', 'status': True, 'parent_id': 1, 'child': []}, {'name': 'item2', 'status': True, 'parent_id': 1, 'c
hild': []}, {'name': 'item3', 'status': True, 'parent_id': 1, 'child': []}], 'parent_id': None}, 2: {'name': '菜单2', 'status': False, 'child': [], 'parent_id': 1},
 3: {'name': '菜单3', 'status': False, 'child': [], 'parent_id': 2}}

处理伪爸爸:等级关系处理

result=[]
    for item in menu_list.values():
        if not item['parent_id']:
            result.append(item)  #真爸爸
        else:
            menu_list[item["parent_id"]]['child'].append(item) #伪爸爸放进真爸爸child
    print(result)

结果:又多了一个儿子菜单2,这个儿子还有个儿子菜单3

[{'name': '菜单1', 'status': True, 'child': [{'name': 'item1', 'status': True, 'parent_id': 1, 'child': []}, {'name': 'item2', 'status': True, 'parent_id': 1, 'chil
d': []}, {'name': 'item3', 'status': True, 'parent_id': 1, 'child': []}, {'name': '菜单2', 'status': False, 'child': [{'name': '菜单3', 'status': False, 'child': []
, 'parent_id': 2}], 'parent_id': 1}], 'parent_id': None}]

最后打印结果:

    for item in result:
        print(item['name'])
        for n in item['child']:
            print("----",n["name"])
            for r in n["child"]:                 #这层为打印孙子菜单3,当然可以递归实现。。。
                print("--------",r['name'])

    return HttpResponse("ok")

菜单1
---- item1
---- item2
---- item3
---- 菜单2
-------- 菜单3

posted @ 2018-09-25 22:46  986428528  阅读(598)  评论(1)    收藏  举报