如何在后台封装el-tree所需要的数据格式

摘要:
背景最近,我们遇到了一个要求,即在层次级别上显示指标。前端使用el树组件,并要求以官方文件的格式提供数据。代码实现:1.设计实体类@DatapublicclassEvaluation{privateStringid;privateStringlabel;privateString parentId;privateList<Evaluation>childList;}2.业务代码publicclassEvaluationService{privateEvaluationDao evaluationDao;publicList<Evaluation>getEvaluation(){//查找所有指标列表<Evaluation˃all=evaluationDao.findAll();//将所有数据放在map中map<String,Evaluation˃treeMap=newHashMap<>();for(int i=0;i<all.size()&!treeMap.contentsKey){result.add;}//遍历数据并将对象放入父节点的childList属性中(int i=0;i<all.size()&&!

背景

最近遇到了一个分层级展示指标的需求,前端使用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所需要的数据格式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇懒加载——实现原理client intended to send too large body下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java(C#)基础差异-语法

1、long类型 Java long类型,若赋值大于int型的最大值,或小于int型的最小值,则需要在数字后加L或者l,表示该数值为长整数,如long num=2147483650L。 举例如下: public static void main(String[] args) { /* * 对于long类型,若赋值大于int型的最大...

php string

一.字符串类型        php一共有8中数据类型        4种基本类型            boolean            integer            float(double)            string        2种符合类型            array            object       ...

【翻译】Flink Table API &amp;amp; SQL 自定义 Source &amp;amp; Sink

本文翻译自官网:https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/sourceSinks.html TableSource 提供访问存储在外部系统(数据库、key-value 存款,消息队列)或文件中的数据的权限。TableSource 在 TableEnviron...

SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)

1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例。 使用技术:SpringBoot、mybatis、shiro、thymeleaf、pagehelper、Mapper插件、druid、dataTables、ztree、jQuery 开发工具:intellij idea 数据库:mysql、red...

大麦网购票插件开发

大麦网购票插件开发 购买插件开发的关键点在于抓包及x-sign的计算。 抓包 抓包辅助插件详见某宝app抓包插件编写 请求头与某宝x-sign,x-umt,x-mini-wua,x-sgext如出一辙,请求包不同的是,请求参数中多了type,version,appType,channel_from,osType,souce等参数。 分析x-sign,x-...

CSP201403-3:命令行选项

引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试,针对计算机软件开发、软件测试、信息管理等领域的专业人士进行能力认证。认证对象是从事或将要从事IT领域专业技术与技术管理人员,以及高校招考研究生的复试对象。   问题描述   请...