快速获取树形结构数据

快速获取树形结构数据

网上看了下获取树形结构数据的方法有很多种,
我这种我个人感觉相对简单和方便点,
下面我就先贴出需求 :

// 后端需要返回的结果
let menuObj={
    '属性1':{
        'a1':{
            '子类1':{
                '孙类1':{
						'牛魔王':{
							'哪吒':{....}
						}
					},
                '孙类2':{},
                '孙类3':{},
                '孙类4':{},
                '孙类5':{}
            },
            '子类2':{
                '孙类1':{},
                '孙类2':{},
                '孙类3':{},
                '孙类4':{}
            },
            '子类3':{
                '孙悟空':{},
                '猪八戒':{}
            }
        },
        'a2':'bbb',
        'a3':'bbb',
        'a4':'bbb'
    },
    '属性2':'aaa',
    '属性3':'aaa',
    '属性4':'aaa',
}

只要数据存在父子关系,很容易就会想起递归 ,对。但是要巧妙地运用递归,下面我就贴上代码:

 /**
      *@author luoluo
      *@Description 获取树形结构数据
      *@Date   9:51 2019/9/25
      *@param
      *@return CommonResult 
      *
      **/
    @GetMapping("getlableTree")
    public CommonResult getlableTree(){
       //这步是从redis中取缓存的数据,如果没有加缓存就不需要这步了
       // String keyData = RedisUtils.getKeyData(labelTree);
       // if(StringUtils.isNotEmpty(keyData)){
       //   Map<String, Object> reidsData = (Map<String, Object>)  
       //   JSONUtils.parse(keyData);      	
       //   return CommonResult.success(reidsData);
       // }
       //先获取主要的属性类 就是 menuObj  属性1 属性2 属性3 属性4
        List<String>   listData = this.labelService.getParentMainlable();
		//LinkedHashMap 有序 保证和数据库查出来的顺序一样
        Map<String, Object> mapData = new LinkedHashMap<>();
        
        for (String label:listData) {
          //这步就是将当前循环中的label 放入到map中,关键是map的value,用递归将其循环到底  下面就来看 getMapData()方法
            mapData.put(label,getMapData(label));
        }
        return CommonResult.success(mapData);
    }
    
    /**
      *@author luoluo
      *@Description 根据标签值递归获取下级 拼接 json
      *@Date   10:50 2019/9/25
      *@param label
      *@return  map
      *
      **/
    public  Map<String, Object> getMapData(String label){

        Map<String, Object> map = new LinkedHashMap<>();
        //根据标签名称获取标签的code
        String code = this.labelService.getLabelCodeByMc(label);
        //根据标签的code 获取当前标签的子标签
        List<String> listData =  this.labelService.getSubLabelbyParentCode(code);

        if (listData !=null && listData.size()>0){
            for (String labels : listData) { 
               // 重复上述步骤          
                map.put(labels,getMapData(labels));
            }
        }
            return map;
    }

个人感觉这个方法还是相对简单点
建议:如果数据量比较大,建议加入缓存
弊端:一次性获取全部数据,数据量很大的时候加载慢 但是数据量相对少点的时候很方便 不需要异步加载获取数据

如果对以上代码有建议和疑问欢迎添加博主
QQ 1136032715
感谢支持!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值