python树形递归.md

import copy

def filter_menu_data(menu_list):
    """菜单数据结构"""
    # 构造字典结构
    menu_dict = {}
    for menu in menu_list:
        menu_dict[menu['id']] = menu

    def get_children_recursion(item):
        """获取子节点"""
        item_children = item.setdefault('children', [])
        # 该节点的所有子节点
        children = [i for i in menu_list if item['id'] == i['parent_id']]
        for child in children:
            # 添加子节点
            item_children.append(child)
            # 递归子节点
            get_children_recursion(child)

    def clear_field(item):
        """清理多余字段"""
        # item.pop('id')
        item.pop('parent_id')
        # item.pop('order_num')
        # item.pop('menu_type')
        for child in item.get('children', []):
            clear_field(child)
        if not item.get('children', []):
            item.pop('children')
        return item

    # 最终结果值
    result = []
    for menu in menu_list:
        # 从导航栏开始递归
        if menu['parent_id'] == 0:
            # 浅拷贝
            get_children_recursion(menu)
            # 深拷贝
            items = clear_field(copy.deepcopy(menu))
            result.append(items)
    for i in result:
        print(i, end='\n\n')



if __name__ == '__main__':
    conf = {
        'host': 'localhost',
        'port': 3306,
        'user': '****',
        'password': '****',
        'db': '****'
    }

    db = MysqlLink(conf)
    # 查询全部
    result = db.query('''
    SELECT id, menu_name, parent_id, order_num, menu_type
    FROM tb_user_menu
    WHERE is_deleted = 0''')
    print(result)
    print()
    filter_menu_data(result)

结果集

# 查询数据
{'id': 1, 'menu_name': '任务总览', 'parent_id': 0, 'order_num': 0, 'menu_type': 1}
{'id': 2, 'menu_name': '调度总览', 'parent_id': 0, 'order_num': 1, 'menu_type': 1}
{'id': 3, 'menu_name': '基础配置', 'parent_id': 0, 'order_num': 2, 'menu_type': 1}
{'id': 4, 'menu_name': '接口配置', 'parent_id': 1, 'order_num': 0, 'menu_type': 2}
{'id': 5, 'menu_name': '任务配置', 'parent_id': 1, 'order_num': 1, 'menu_type': 2}
{'id': 6, 'menu_name': '接口列表', 'parent_id': 4, 'order_num': 0, 'menu_type': 3}
{'id': 8, 'menu_name': '任务列表', 'parent_id': 5, 'order_num': 0, 'menu_type': 3}
{'id': 10, 'menu_name': '调度配置', 'parent_id': 2, 'order_num': 0, 'menu_type': 2}
{'id': 11, 'menu_name': '运行日志', 'parent_id': 2, 'order_num': 1, 'menu_type': 2}
{'id': 12, 'menu_name': '调度列表', 'parent_id': 10, 'order_num': 0, 'menu_type': 3}
{'id': 14, 'menu_name': '执行列表', 'parent_id': 11, 'order_num': 0, 'menu_type': 3}
{'id': 15, 'menu_name': '执行服务器配置', 'parent_id': 3, 'order_num': 0, 'menu_type': 2}
{'id': 16, 'menu_name': '预警配置', 'parent_id': 3, 'order_num': 1, 'menu_type': 2}
{'id': 17, 'menu_name': '执行服务器列表', 'parent_id': 15, 'order_num': 0, 'menu_type': 3}
{'id': 19, 'menu_name': '预警配置列表', 'parent_id': 16, 'order_num': 0, 'menu_type': 3}
{'id': 21, 'menu_name': '执行服务器状态', 'parent_id': 15, 'order_num': 1, 'menu_type': 3}
{'id': 22, 'menu_name': '参数配置', 'parent_id': 5, 'order_num': 3, 'menu_type': 3}
{'id': 23, 'menu_name': '数据源配置', 'parent_id': 5, 'order_num': 2, 'menu_type': 3}
# 递归结果
{'id': 1, 'menu_name': '任务总览', 'order_num': 0, 'menu_type': 1, 'children': [{'id': 4, 'menu_name': '接口配置', 'order_num': 0, 'menu_type': 2, 'children': [{'id': 6, 'menu_name': '接口列表', 'order_num': 0, 'menu_type': 3}]}, {'id': 5, 'menu_name': '任务配置', 'order_num': 1, 'menu_type': 2, 'children': [{'id': 8, 'menu_name': '任务列表', 'order_num': 0, 'menu_type': 3}, {'id': 22, 'menu_name': '参数配置', 'order_num': 3, 'menu_type': 3}, {'id': 23, 'menu_name': '数据源配置', 'order_num': 2, 'menu_type': 3}]}]}

{'id': 2, 'menu_name': '调度总览', 'order_num': 1, 'menu_type': 1, 'children': [{'id': 10, 'menu_name': '调度配置', 'order_num': 0, 'menu_type': 2, 'children': [{'id': 12, 'menu_name': '调度列表', 'order_num': 0, 'menu_type': 3}]}, {'id': 11, 'menu_name': '运行日志', 'order_num': 1, 'menu_type': 2, 'children': [{'id': 14, 'menu_name': '执行列表', 'order_num': 0, 'menu_type': 3}]}]}

{'id': 3, 'menu_name': '基础配置', 'order_num': 2, 'menu_type': 1, 'children': [{'id': 15, 'menu_name': '执行服务器配置', 'order_num': 0, 'menu_type': 2, 'children': [{'id': 17, 'menu_name': '执行服务器列表', 'order_num': 0, 'menu_type': 3}, {'id': 21, 'menu_name': '执行服务器状态', 'order_num': 1, 'menu_type': 3}]}, {'id': 16, 'menu_name': '预警配置', 'order_num': 1, 'menu_type': 2, 'children': [{'id': 19, 'menu_name': '预警配置列表', 'order_num': 0, 'menu_type': 3}]}]}

你可能感兴趣的:(python树形递归.md)