背景

最近遇到了一个分层级展示指标的需求,前端使用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. java架构之路-(Redis专题)SpringBoot连接Redis超简单

    上次我们搭建了Redis的主从架构,哨兵架构以及我们的集群架构,但是我们一直还未投入到实战中去,这次我们用jedis和springboot两种方式来操作一下我们的redis 主从架构 如何配置我上次已 ...

  2. liunux中的标准输出。以及常用的 2>dev/null 命令的含义

    了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. 首先我们来了解一下linux ...

  3. 简单认识JVM

    准备: 在具体聊JVM之前,我们先看两张图,通过分析图,咱们慢慢来聊聊JVM. JVM内存结构图 JVM内存结构脑图 上面两张图中,第二张图相对来说比较直观,就是JVM内存结构都划分成了哪些模块,各个 ...

  4. 用Python校准本地时间

    目录 1. 概念 1.1 基本概念 1.2 版本演进 2. 示例演示 2.1 前提条件 2.2 完整代码 2.3 其他问题 3. 参考信息: 1. 概念 1.1 基本概念 时间,对于我们来说很重要,什 ...

  5. C语言算法动态规划板子题汇总

    本篇博客仅为对动态规划基础问题的状态转移方程进行求解,然后给出对应的注释代码,有关题目的具体内容可在算法导论或网络上进行查看 目录 1.钢管切割(最小值) 2.两条流水线调度 3.多条流水线调度 4. ...

  6. Mysql数据库(八)存储过程与存储函数

    一.创建存储过程与存储函数 1.创建存储过程(实现统计tb_borrow1数据表中指定图书编号的图书的借阅次数) mysql> delimiter // mysql> CREATE PRO ...

  7. GO基础之List

    一.List定义 概述1.list是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系.list有多种实现方法,如单向链表.双向链表等.2.Go语言中list的实现原理是双向链表 ...

  8. Git学习笔记----基础运用

    安装Git Windows: 进入官网下载或百度网盘下载 Git(V2.23_x64) 提取码:uf2x Ubuntu: sudo apt-get -install git 安装完成之后打开git命令 ...

  9. [python]一些常用的python知识总结

    Pthon知识积累,遇到的各种python问题汇总 json.dumps()和json.loads()是json格式处理函数 json.dumps()函数是将一个Python数据类型列表进行json格 ...

  10. Pandas 分组聚合

    # 导入相关库 import numpy as np import pandas as pd 创建数据 index = pd.Index(data=["Tom", "Bo ...