背景

最近遇到了一个分层级展示指标的需求,前端使用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. Tensorflow从开始到放弃(技术篇)

    在gpu中运行 tf.device("/gpu:1") 有时候这个是会出问题的,即便你在有名称为1的gpu时.有的操作是不能支持gpu的,应该为session添加一些配置: pyt ...

  2. markdown数学公式大全

    目录 Cmd Markdown 公式指导手册 一.公式使用参考 1.如何插入公式 2.如何输入上下标 3.如何输入括号和分隔符 4.如何输入分数 5.如何输入开方 6.如何输入省略号 7.如何输入矢量 ...

  3. CodeForces - 1214D D. Treasure Island

    题目链接:https://vjudge.net/problem/2728294/origin 思路:可以抽象成管道,先试试能不能找到一个通道能通到终点, 如果可以则封锁这个通道,一个石头即可, 再试试 ...

  4. Java多线程编程(二)对象及变量的并发访问

    一.synchronized同步方法 1.方法内的变量为线程安全 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了. 示例: ...

  5. unityevent与持续按键触发

    上一篇中提到一种鼠标按下时的事件触发,即采用eventtrigger设定pointerdown和pointerup并绑定相应事件.但是若要实现持续按键则需要对绑定的每个方法都添加实现持续按键方法.所以 ...

  6. python的GIL锁

    进程:系统运行的一个程序,是系统分配资源的基本单位. 线程:是进程中执行运算的最小单位,是处理机调度的基本单位. 处理机:是计算机中存储程序和数据,并按照程序规定的步骤执行指令的部件.包括中央处理器. ...

  7. node-批量上传文件

    很多项目可能都会涉及到的业务是关于多文件上传的,那么需要使用到redis或者第三方库(使用redis)来实现任务队列,甚至需要控制并发量和分包(一次请求传多个文件),这样每次都会以实现功能来完成,但是 ...

  8. ArcGIS Engine制作DIY地图工具

    本节将向你介绍,利用ToolStrip制作自定义GIS工具条. 步骤如下: ①向ToolStrip中添加一个Button ②向该Button的lmg属性添加图片素材,并将Button的图片比例(Ima ...

  9. VS运行遇到的那些坑

    今天运行VS项目好好的,就是安装了VS2019后,就出现了无法连接到IIS服务器,这个问题,然后各种办法都试了无效. 解决方法: 1.删除根目录的.vs文件,然后重新生成. 2.修改调试这里的IP改为 ...

  10. 【xinsir】分享一个查找文件的脚手架

    program.command('find <name>').action(name => { if (name) { inquirer .prompt([ { type: 'inp ...