无限极分类

该博客展示了两种不同的方法,非递归和递归,来构建菜单树结构。通过Python代码实现,从给定的数据中组织成树形结构,其中非递归方法通过迭代查找父节点并附加子节点,而递归方法则是通过函数递归查找子节点。这两种方法都是为了将扁平化的数据转换为层次结构,适用于数据组织和显示。
摘要由CSDN通过智能技术生成

非递归方式

import json

def format(data):
    print(json.dumps(data, indent=4, ensure_ascii=False, sort_keys=False, separators=(',', ':')))

def getTree(menu_list):
    # 处理数据
    menu_map = {}
    for item in menu_list:
        item["child"] = []
        menu_map[item["id"]] = item

    tree = []
    for item in menu_map.values():
        if menu_map.get(item["pid"]): # 找儿子
            menu_map[item["pid"]]["child"].append(item)
        else: # 找出所有的顶级
            tree.append(item)

    return tree


if __name__ == '__main__':
    menu_list = [
        {
            "id": 1,
            "pid": 0,
            "name": "top1"
        },
        {
            "id": 2,
            "pid": 0,
            "name": "top2"
        },
        {
            "id": 3,
            "pid": 1,
            "name": "top1-sub1"
        },
        {
            "id": 4,
            "pid": 1,
            "name": "top1-sub2"
        },
        {
            "id": 5,
            "pid": 3,
            "name": "top1-sub1-sub1"
        },
        {
            "id": 6,
            "pid": 2,
            "name": "top2-sub1"
        },
    ]

    format(getTree(menu_list))

递归方式


import json

def format(data):
    print(json.dumps(data, indent=4, ensure_ascii=False, sort_keys=False, separators=(',', ':')))

# 父亲找儿子
def getTree(menu_list,pid):

    tree = []
    for item in menu_list:
        if item["pid"] == pid:
            item["child"] = getTree(menu_list, item["id"]) # 找儿子的过程
            tree.append(item)
    return tree

if __name__ == '__main__':
    menu_list = [
        {
            "id": 1,
            "pid": 0,
            "name": "top1"
        },
        {
            "id": 2,
            "pid": 0,
            "name": "top2"
        },
        {
            "id": 3,
            "pid": 1,
            "name": "top1-sub1"
        },
        {
            "id": 4,
            "pid": 1,
            "name": "top1-sub2"
        },
        {
            "id": 5,
            "pid": 3,
            "name": "top1-sub1-sub1"
        },
        {
            "id": 6,
            "pid": 2,
            "name": "top2-sub1"
        },
    ]

    format(getTree(menu_list,0))

 原文地址:https://www.cnblogs.com/sookie2020/p/14192879.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值