组织树查询-Jvava实现(递归)

1.首先查询出组织机构

就是一个简单的查询

List<Dept> deptList = mapper.getDeptList();
        Map<Long, OrgNode> nodeMap = new HashMap<>();
        List<Long> rootIds = new ArrayList<>();
        for (Dept dept : deptList) {
            Long deptId = dept.getDeptId();
            String name = dept.getDeptName();
            Long parentId = dept.getParentId();
            OrgNode node = nodeMap.computeIfAbsent(deptId, OrgNode::new);
            node.setId(deptId);
            node.setLabel(name);
            node.setParentId(parentId);

            if (parentId == 0) {
                rootIds.add(deptId);
            } else {
                OrgNode parent = nodeMap.computeIfAbsent(parentId, OrgNode::new);
                parent.getChildren().add(node);
            }
        }
        // 3. 输出组织机构
        List<OrgNode> orgList = new ArrayList<>();
        for (long rootId : rootIds) {
            orgList.add(nodeMap.get(rootId));
        }
        List<Map<String, Object>> result = dfs2(orgList);

2.def2方法,只查询两级

业务需要

/**
     * 只查询两级
     * @param nodes
     * @return
     */
    private static List<Map<String, Object>> dfs2(List<OrgNode> nodes) {
        List<Map<String, Object>> result = new ArrayList<>();
        for (OrgNode node : nodes) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", node.getId());
            map.put("label", node.getLabel());
            map.put("parentId", node.getParentId());
            List<OrgNode> children = node.getChildren();
            if (children != null && !children.isEmpty()){
                List<OrgNode> collect = children.stream().peek(s -> s.setChildren(null)).collect(Collectors.toList());
                map.put("children", collect);
            }
            result.add(map);
        }
        return result;
    }

效果

组织树查询-Jvava实现(递归)

查询所有级别递归查询


/**
     * 查询所有组织树
     * @param nodes
     * @return
     */
    private static List<Map<String, Object>> dfs(List<OrgNode> nodes) {
        List<Map<String, Object>> result = new ArrayList<>();
        for (OrgNode node : nodes) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", node.getId());
            map.put("label", node.getLabel());
            map.put("parentId", node.getParentId());
            List<OrgNode> children = node.getChildren();
            if (children != null && !children.isEmpty()) {
                map.put("children", dfs(children));
            }
            result.add(map);
        }
        return result;
    }

3.前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>树形控件</title>
    <script src="js/vue.js"></script>
    <script src="element-ui/lib/index.js"></script>
    <script src="js/axios-0.18.0.js"></script>
    <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">
</head>
<body>
<div id="app">
    <el-tree
            :data="data"
            show-checkbox
            default-expand-all
            node-key="id"
            ref="tree"
            highlight-current
            :props="defaultProps"
            @check-change="handleCheckChange"
            :indent="20"
    >
    </el-tree>
    <el-button @click="getCheckedNodes">通过 node 获取</el-button>
</div>



<script>
    new Vue({
        el:"#app",
        methods:{
            getCheckedNodes(){
              console.log("打印选中结果:"+this.selectedNodeData)
            },
            handleCheckChange(data, targetNode){
                let checkedNodes = this.$refs.tree.getCheckedNodes() // 获取所有选中的节点数据
                // console.log('当前选中的节点:', checkedNodes)
                // 获取选中节点的 ID 列表
                let checkedNodeIds = checkedNodes.map(node => {
                    return node.id
                })
                this.selectedNodeData=checkedNodeIds;
                console.log('当前选中的节点 ID 列表:', this.selectedNodeData)
            },
            getNodeIds(node, ids) {
                // 处理当前节点的 ID
                ids.push(node.id)

                // 处理所有子节点的 ID
                for (let child of node.children) {
                    this.getNodeIds(child, ids)
                }
            },
            getList(){
                axios.get('http://localhost:8081/brand_case/dao.do?method=list_tree').then( res=>{
                        this.data=res.data.data
                    }
                )
            }
        },
        created(){
            this.getList();
        },
        data(){
            return{
                selectedNodeData: [],
                data: [{
                    id: 1,
                    label: '一级 1',
                    children: [{
                        id: 4,
                        label: '二级 1-1',
                        children: [{
                            id: 9,
                            label: '三级 1-1-1'
                        }, {
                            id: 10,
                            label: '三级 1-1-2'
                        }]
                    }]
                }, {
                    id: 2,
                    label: '一级 2',
                    children: [{
                        id: 5,
                        label: '二级 2-1'
                    }, {
                        id: 6,
                        label: '二级 2-2'
                    }]
                }, {
                    id: 3,
                    label: '一级 3',
                    children: [{
                        id: 7,
                        label: '二级 3-1',
                        children: [{
                            id: 7-1,
                            label: '二级 3-1-1'
                        }]
                    }, {
                        id: 8,
                        label: '二级 3-2'
                    }]
                }],
                defaultProps: {
                    children: 'children',
                    label: 'label'
                }
            }
        }
    })
</script>
</body>
</html>

原文链接:https://www.cnblogs.com/sy2022/p/17333039.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:组织树查询-Jvava实现(递归) - Python技术站

(0)
上一篇 2023年4月19日
下一篇 2023年4月19日

相关文章

  • 解决java文件流处理异常 mark/reset not supported问题

    Java文件流处理异常“mark/reset not supported”的解决方法如下: 问题描述 在使用Java文件流处理时,有时候会出现“mark/reset not supported”的异常信息。这个异常的原因是因为Java文件流默认不支持mark和reset方法。这两个方法是InputStream的一部分,但并不是所有的InputStream实现…

    Java 2023年5月27日
    00
  • Java开发基础日期类代码详解

    Java开发基础日期类代码详解 在Java开发中,经常需要处理日期和时间相关的数据。为了方便处理日期和时间,Java提供了一些日期类。这些日期类可以帮助我们实现日期格式化、日期比较、日期计算等操作。本文将详细讲解Java日期类的使用方法,包括如何创建日期对象、如何进行日期格式化和解析、如何比较日期、如何计算日期等。 如何创建日期对象 Java中有多种日期类,…

    Java 2023年5月20日
    00
  • 轻松掌握Java单例模式

    下面就是详细讲解“轻松掌握Java单例模式”的完整攻略。 什么是Java单例模式 单例模式是一种创建型设计模式,它通过确保类只有一个实例而使得该实例对整个应用程序可见和可用。单例模式通常用于控制资源的访问,例如数据库连接或线程池等。 在Java中,单例模式可以通过下面两种方式来实现: 懒汉模式:在第一次调用getInstance()方法时才创建实例。 饿汉模…

    Java 2023年5月26日
    00
  • SpringBoot项目实现关闭数据库配置和springSecurity

    SpringBoot是一个非常流行的Java Web开发框架,它具有易用、快速开发、健壮性好等优点。在一些场景中我们需要关闭数据库配置或者关闭Spring Security,下面就具体介绍一下如何实现: 关闭数据库配置 在一些场景中,我们并不需要使用数据库,比如开发一个展示页面的网站,这时我们就可以关闭数据库配置。 步骤一:排除数据库依赖 在pom.xml文…

    Java 2023年5月20日
    00
  • Android 下的 QuickJS Binding 库特性使用详解

    Android 下的 QuickJS Binding 库特性使用详解 简介 QuickJS Binding 库是一个用于在 Android 平台上使用 JavaScript 的库。这个库允许开发人员在 Android 应用中使用 JavaScript 进行开发,并且可以将 JavaScript 和 Java 进行相互调用。QuickJS Binding 库提…

    Java 2023年5月26日
    00
  • java工程师进阶之MyBatis延迟加载的使用

    Java工程师进阶之MyBatis延迟加载的使用攻略 MyBatis是Java中常用的一款ORM框架,它能够简化Java与关系型数据库的交互,提高工作效率。MyBatis在优化查询性能方面表现尤为突出,其中延迟加载技术尤为重要。本篇攻略将重点介绍MyBatis中的延迟加载技术的使用方法及技巧。 什么是MyBatis的延迟加载 MyBatis的延迟加载(Laz…

    Java 2023年5月20日
    00
  • 深入分析java与C#底层控制能力区别及示例详解

    深入分析Java与C#底层控制能力区别及示例详解 介绍 Java与C#作为两种常用的面向对象编程语言,在诸多方面都有其自身的优势和特点。本文将主要探讨Java与C#的底层控制能力的差异。通过具体的示例,展示Java和C#在底层内存控制、指针使用等方面的异同点。 Java与C#的底层控制能力对比 内存管理 Java和C#都是通过垃圾回收机制进行生命周期的管理的…

    Java 2023年5月27日
    00
  • JavaEE实现文件下载

    下面我来为您详细讲解JavaEE实现文件下载的完整攻略。 什么是文件下载 文件下载是指用户从计算机或网络中下载文件的过程。 在Web应用中,文件下载常见于用户需要下载某个文件,例如: PDF格式的文件 Word文档 Excel表格 图片文件(JPG、PNG等) 视频文件(MP4、AVI等) 压缩文件(ZIP、RAR等) JavaEE实现文件下载的过程 Jav…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部