• 实现无限级分类的数据结构


    关于多重分类的问题

    分类下有子分类,子分类下又有子子分类要怎么规划这个结构

    数据准备:

    data=[
        {"cat_id":3,"name":"沙河","parent_id":1},
        {"cat_id":4,"name":"sb镇","parent_id":3},
        {"cat_id": 1, "name": "北京", "parent_id": 0},
        {"cat_id":5,"name":"昌平","parent_id":1},
        {"cat_id":6,"name":"青浦","parent_id":2},
        {"cat_id": 2, "name": "上海", "parent_id": 0},
    ]
    

    期望获得结构形式:

    北京
    -沙河
    --sb镇
    -昌平
    上海
    -青浦
    

    以上,北京是一个一级分类,沙河是北京分类的子分类,属于二级分类,sb镇是沙河镇的子分类,属于三级分类,然后昌平也是北京的子类,属于二级分类。 接下来是上海,属于一级分类,青浦是上海的子分类,属于二级分类。

    要实现这样的结构,需要用递归

    lis = []
    def get_son1(data,parent_id=0,level=0,is_clear=True):
        #第一次递归的时候一定是能进去的
        if is_clear:
            lis.clear()
        # 循环遍历这个data列表,每个元素都是字典
        for item in data:
            #判断当前元素的父分类是不是等于传进来的参数parent_id
            if item['parent_id']==parent_id:
                #是的话就把传进来的level赋值给他的level,比如到这里,北京的level就是0了、
                item['level']=level
                #然后把北京推进这个空列表里。
                lis.append(item)
                #然后开始进入递归,把当前的id当做parent_id传进去
     			get_son1(data,parent_id=item["cat_id"],level=level+1,
     			is_clear=False)
        return lis
    
    

    这是不用level的情况

    实际使用情况,只会传过来一个分类和他的子分类,比如

        [{"cat_id":3,"name":"沙河","parent_id":1},
        {"cat_id":4,"name":"sb镇","parent_id":3},
        {"cat_id": 1, "name": "北京", "parent_id": 0},
        {"cat_id":5,"name":"昌平","parent_id":1}]
    

    应用场景是,点击了一个分类,展示所有这个分类和子分类下的产品。

    调用这个方法的时候,以下

     #获取所有分类中属于param.get("category_id")的子类,并包含它自己
        #data是所有分类,第二个参数是你点击的分类的id
    all_cat_id = func.get_son_id_list(data,param.get("category_id"))
    
    res_id=[]
    #parent_id 就是你点击的分类的id,找这个分类下的所有子分类。
    def get_son_id_list(data,parent_id,is_clear=True):
        #第一次走的时候就会进入这个if
        if is_clear:
            res_id.clear()
            #如果parent_id不等与0,就把自己加进去,因为等于0的时候,下面的逻辑会加
            if parent_id:
                res_id.append(parent_id)
        for item in data:
            #如果该分类的父级id为传过的parent_id,就把它的cat_id,存到res_id,接着找它自己有没有儿子,进行递归,是0的时候就代表是一个一级分类,也能满足,直接加进去。
            if item['parent_id']==parent_id:
                res_id.append(item['cat_id'])
                #开始递归,data还是原来的data,parent改成当前的分类id,找子子孙孙
                get_son_id_list(data,parent_id=item["cat_id"],
                is_clear=False)
        return res_id
    #最后返回的是一个存放id的列表,根据这个列表里面的id,去查找在这些分类下的商品
    

    面试题

    不用递归的方式完成(推荐):

    def get_tree(data):
        #先定义一个空列表和空字典
        lists=[]
        tree={}
        #循环传进来的列表套字典
        for item in data:
            #把所有的分类的id和分类字典以键值对的形式存进这个空字典
            tree[item['cat_id']]=item
        #再次开始循环这个列表
        for i in data:
            #如果当前的分类的父分类是0
            if not i['parent_id']:
                #就直接把这个分类的id存进空列表
                lists.append(tree[i['cat_id']])
            else:
                #如果不是0的话,就把他的父分类的id复制给parent_id
                parent_id=i['parent_id']
                #判断这个分类的父有没有children这个键,没有的话就给他一个。
                if "children" not in tree[parent_id]:
                    tree[parent_id]["children"]=[]
                #然后把当前分类的id,存到他的父分类的children里面。
                tree[parent_id]['children'].append(tree[i['cat_id']])
    
        return lists
    
    
  • 相关阅读:
    C++ 编写strcpy函数
    JavaScript抽象类及Class.create备忘
    读:<测试一下你解决问题的逻辑思维及算法能力>后
    JavaScript AJAX类
    MOSS ad组的获取及Hashtable作缓存总结
    Js获取元素位置及动态生成元素的练习备忘
    NET许可证及License
    Javascript获取元素位置及其它
    hdu 149850 years, 50 colors 最大匹配
    poj 2513 Colored Sticks 字典树
  • 原文地址:https://www.cnblogs.com/chanyuli/p/12030150.html
Copyright © 2020-2023  润新知