背景

最近遇到了一个分层级展示指标的需求,前端使用el-tree树形组件,要求按官方文档的格式提供数据。

数据格式:

    id: 1,
label: '一级 1',
children:
id: 4,
label: '二级 1-1',
children:
id: 9,
label: '三级 1-1-1',
children: ...

封装思路

1、首先我们需要获取到所有的节点,新建一个集合result来保存所有顶级节点,也就是parentId为空的或指定值。

2、然后我们需要找出二级节点存入到顶级节点的childList中,找到三级节点存入到二级节点的childList中,依次类推,最后将result返回。

代码实现:

1、设计实体类

@Data
public class Evaluation {
private String id;
private String label;
private String parentId;
private List<Evaluation> childList;
}

2、业务代码

public class EvaluationService {

    private EvaluationDao evaluationDao;

    public List<Evaluation> getEvaluations() {
// 查出所有指标
List<Evaluation> all = evaluationDao.findAll(); // 把所有的数据都放到map中
Map<String, Evaluation> treeMap = new HashMap<>();
for (int i = 0; i < all.size() && !all.isEmpty(); i++) {
// 元素的id为键,元素本身为值
treeMap.put(all.get(i).getId(), all.get(i));
} // 将所有顶层节点存入result中
List<Evaluation> result = new ArrayList<>();
// 遍历map得到顶层节点或者游离节点
for (int i = 0; i < all.size(); i++) {
if (!treeMap.containsKey(all.get(i).getParentId())) {
result.add(all.get(i));
}
} // 遍历数据,将对象放入父级节点的childList属性中
for (int i = 0; i < all.size() && !all.isEmpty(); i++) {
Evaluation Evaluation = treeMap.get(all.get(i).getParentId());
if (Evaluation != null) {
// 有父节点,校验父节点下childList是否存在,然后将子节点放入
if (Evaluation.getChildList() == null) {
Evaluation.setChildList(new ArrayList<>());
}
// 添加到父节点的ChildList集合下
Evaluation.getChildList().add(all.get(i));
}
}
return result;
}
}

如果项目中使用的不多的话,这样就可以了。实现方式可以有很多种,用上边的方式的好处在于免去了多次到数据库查询的操作,而且可以灵活封装多层级数据,二层、三层、五层等等都可以。

封装工具类

为了实现代码的复用,我们可以将上方代码封装成工具类。

DataTree接口:

写这个接口类主要是为了下面的工具类,定义泛型T的类型

public interface DataTree<T> {

    public String getId();

    public String getParentId();

    public void setChildList(List<T> childList);

    public List<T> getChildList();
}

工具类实现:

以下的泛型T就是接收数据的实体类,要继承上面数据接口类

public class TreeUtils {

    //获取顶层节点
public static <T extends DataTree<T>> List<T> getTreeList(String topId, List<T> entityList) { List<T> resultList = new ArrayList<>(); Map<Object, T> treeMap = new HashMap<>(); T itemTree; for (int i = 0; i < entityList.size() && !entityList.isEmpty(); i++) {
itemTree = entityList.get(i);
//把所有的数据放到treeMap中,id为key
treeMap.put(itemTree.getId(), itemTree);
//把顶层节点放到集合resultList中
if (topId.equals(itemTree.getParentId()) || itemTree.getParentId() == null) {
resultList.add(itemTree);
}
} //循环数据,把数据放到上一级的childen属性中
for (int i = 0; i < entityList.size() && !entityList.isEmpty(); i++) {
itemTree = entityList.get(i);
T data = treeMap.get(itemTree.getParentId());
// 不等于null,也就意味着有父节点
if (data != null) {
if (data.getChildList() == null) {
data.setChildList(new ArrayList<>());
}
//把子节点 放到父节点childList当中
data.getChildList().add(itemTree);
//把放好的数据放回map当中
treeMap.put(itemTree.getParentId(), data);
}
}
return resultList;
}
}

使用方式:

1、实体类:

设计实体类,实现之前定义好的DataTree接口

@Data
public class Evaluation implements DataTree<Evaluation> { private String id; private String label; private String parentId; private List<Evaluation> childList;
}

2、调用TreeUtils,传入数据和顶层节点id,即可获取到所需要的数据结构。

public class Test {
private EvaluationDao evaluationDao; public List<Evaluation> getEvaluations() { // 接收在数据库中查询到的数据
List<Evaluation> data = evaluationDao.findAll(); // 调用工具类,第一个参数是默认传入的顶级id,和查询出来的数据
return TreeUtils.getTreeList("0", data);
}
}

如何在后台封装el-tree所需要的数据格式的更多相关文章

  1. Echarts后台封装option对象

    该方法返回的keyword指向了前台负责图表显示的jsp页面 public String keyword() { if(this.dateNum == null || this.dateNum.equ ...

  2. SSM 后台封装的有值, 到前台打印的时候没有值

    原因: 实体类中的getting  setting 方法没有配置,导致封装json 数据的时候没有封装进去

  3. 前后台数据交互 后台封装数据 json格式

    namespace ~.sverIterface { public class EventPlayerInfo { public string name { get; set; } public st ...

  4. java 后台封装json数据学习总结(一)

    一.数据封装 1. List集合转换成json代码 List list = new ArrayList(); list.add( "first" ); list.add( &quo ...

  5. 后台封装的easyui框架,处理texbox的时候报错:未结束的字符串常量。

    原因:特殊字符导致json字符串转换成json对象出错 解决:找到初始值的地方进行过滤 代码如下: theString = theString.Replace(">", &q ...

  6. java 后台封装json数据学习总结(二)

    一.JSONArray的应用 从json数组中得到相应java数组,如果要获取java数组中的元素,只需要遍历该数组. /* * 从json数组中得到相应java数组 * JSONArray下的toA ...

  7. java 后台封装json数据学习总结

    一.数据封装 1. List集合转换成json代码 List list = new ArrayList(); list.add( "first" ); list.add( &quo ...

  8. aceAdmin fuelux tree 从后台获取数据,并设置节点ID等属性

    如题,从后台封装数据,有两种方式渲染节点的数据: 1.全部节点加载 2.根据父节点加载子节点 首先,先介绍下第一种渲染方式: 后台返回数据格式(所有的附加属性,都可放在additionalParame ...

  9. easyui struts后台实现tree返回json数据

    首先jsp页面有一ul用于展现tree <ul id="trueULid"></ul> 加载tree <script type="text/ ...

随机推荐

  1. 【Spring Cloud】客户端负载均衡组件——Ribbon(三)

    一.负载均衡 负载均衡技术是提高系统可用性.缓解网络压力和处理能力扩容的重要手段之一. 负载均衡可以分为服务器负载均衡和客户端负载均衡,服务器负载均衡由服务器实现,客户端只需正常访问:客户端负载均衡技 ...

  2. 安装Go语言及搭建Go语言开发环境

    一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://gol ...

  3. Juc1024小半年总结-面试篇

    大家好,我叫Juc 这大概是我时隔2年度多 第一次以分享的形式发的第一篇公众号 今天是2019年10月26 本想在10月24就分享一下 可惜前面两天时间太忙... 很凑巧,今天我出来工作刚好满4个月, ...

  4. 如何利用Fiddler4进行Android APP / IOS APP抓包

    Fiddler抓包 1.Fiddler介绍 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据. F ...

  5. Leetcode Tags(6)Math

    一.204. Count Primes Count the number of prime numbers less than a non-negative number, n. Input: 10 ...

  6. Java 高并发之魂

    前置知识 了解Java基本语法 了解多线程基本知识 知识介绍 Synchronized简介:作用.地位.不控制并发的后果 两种用法:对象锁和类锁 多线程访问同步方法的7种情况:是否是static.Sy ...

  7. 爬取bing背景图片

    因为工作环境的原因,没办法用梯子,也不喜欢用某度,只能用bing,发现背景图片蛮好看的,刚好最近在学习摄影,需要提高审美,就想着把bing背景图片都爬去下来做桌面背景.写的代码比较入门,只是做个记录, ...

  8. ArcSDE 10 for SQL Server安装教程(含下载链接)

    亲测:ArcSDE 10.1适用于ArcGIS10.2的版本. 该版本支持SQL Server.Oracle.PostgreSQL等数据库连接 下载链接(含安装包和授权文件): 链接:https:// ...

  9. *args和**kwargs的作用

    ∗args的作用: *的作用有2个 打包参数(pack)和拆分参数(unpack) 函数接受实参时,按顺序分配给函数形参,如果遇到带∗的形参,那么就把还未分配出去的实参以元组形式打包(pack),分配 ...

  10. 差异:后缀数组(wzz模板理解),单调栈

    因为涉及到对模板的理解,所以就着代码看会好一些. 让那些坚决不颓代码的人受委屈了. 我是对着wzz的板子默写的,可能不完全一样啊. 还有代码注释里都是我个人的理解,不保证正确,但欢迎指正. 可以有选择 ...