如何在后台封装el-tree所需要的数据格式
背景
最近遇到了一个分层级展示指标的需求,前端使用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所需要的数据格式的更多相关文章
- Echarts后台封装option对象
该方法返回的keyword指向了前台负责图表显示的jsp页面 public String keyword() { if(this.dateNum == null || this.dateNum.equ ...
- SSM 后台封装的有值, 到前台打印的时候没有值
原因: 实体类中的getting setting 方法没有配置,导致封装json 数据的时候没有封装进去
- 前后台数据交互 后台封装数据 json格式
namespace ~.sverIterface { public class EventPlayerInfo { public string name { get; set; } public st ...
- java 后台封装json数据学习总结(一)
一.数据封装 1. List集合转换成json代码 List list = new ArrayList(); list.add( "first" ); list.add( &quo ...
- 后台封装的easyui框架,处理texbox的时候报错:未结束的字符串常量。
原因:特殊字符导致json字符串转换成json对象出错 解决:找到初始值的地方进行过滤 代码如下: theString = theString.Replace(">", &q ...
- java 后台封装json数据学习总结(二)
一.JSONArray的应用 从json数组中得到相应java数组,如果要获取java数组中的元素,只需要遍历该数组. /* * 从json数组中得到相应java数组 * JSONArray下的toA ...
- java 后台封装json数据学习总结
一.数据封装 1. List集合转换成json代码 List list = new ArrayList(); list.add( "first" ); list.add( &quo ...
- aceAdmin fuelux tree 从后台获取数据,并设置节点ID等属性
如题,从后台封装数据,有两种方式渲染节点的数据: 1.全部节点加载 2.根据父节点加载子节点 首先,先介绍下第一种渲染方式: 后台返回数据格式(所有的附加属性,都可放在additionalParame ...
- easyui struts后台实现tree返回json数据
首先jsp页面有一ul用于展现tree <ul id="trueULid"></ul> 加载tree <script type="text/ ...
随机推荐
- stm32cubeMX配置LWIP
MCU:stm32f769NIHx PHY:LAN8742A LWIP_VERSION:2.0.3 1.配置RCC,串口(printf debug log) (1)开启RCC,配置时钟系统 图1.1 ...
- opencv::opencv_createsamples.exe
opencv_createsamples.exe 用来生成正样本vec的,用来准备训练用的正样本数据和测试数据.他的输出为以 *.vec 为扩展名的文件,该文件以二进制方式存储图像. Usage: o ...
- git生成SSH秘钥
1.进入git bash , 输入 cd ~/.ssh/ ,没有的话,自己创建 mkdir ~/.ssh , 然后进入该文件夹完成生成秘钥步骤 2.配置全局的name和email,这里是的你githu ...
- Java8系列 (二) Stream流
概述 Stream流是Java8新引入的一个特性, 它允许你以声明性方式处理数据集合, 而不是像以前的指令式编程那样需要编写具体怎么实现. 比如炒菜, 用指令式编程需要编写具体的实现 配菜(); 热锅 ...
- 轻量级CNN模型mobilenet v1
mobilenet v1 论文解读 论文地址:https://arxiv.org/abs/1704.04861 核心思想就是通过depthwise conv替代普通conv. 有关depthwise ...
- 查看线上日志利器less
less实用命令 搜索 很多关于命令的解释有点令人困惑,因为前字,forward是向前,before也是前面. 上表示backward 下表示forward 向下搜索 / - 使用一个模式进行搜索,并 ...
- unity 动画 音频播放
采用Unity进行音频动画的播放时最常用的技术,在此进行一下简单讲解与应用. (一)动画播放(本文采用animation进行验证,关于animation和animator区别可问度娘,在此不做赘述) ...
- day3-02 python入门之基本的数据类型
目录 一.整型(int) 二.浮点型(float) 三.字符串类型(str) 字符串在python2和python3中的细微区别 四.复数 五.列表(list) 六.数据字典(dict) 定义方式 七 ...
- 博客文章编辑器 Cmd Markdown
欢迎使用 Cmd Markdown 编辑阅读器 编辑器点击打开链接 学习语言地址点击打开链接
- 分布式id生成方案总结
本文已经收录自 JavaGuide (60k+ Star[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.) 本文授权转载自:https://juejin.im/post/ ...