快速获取树形结构数据
网上看了下获取树形结构数据的方法有很多种,
我这种我个人感觉相对简单和方便点,
下面我就先贴出需求 :
// 后端需要返回的结果
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
感谢支持!!