一维数组结构数据转换树形结构数据JS方法

在写小程序项目时,自定义了一个组织机构树形展示组件,后端接口返回的组织机构数据是一维数组。需要在前端转换成树形结构的数据,并且添加一些节点的树形,比如是否为叶子节点,节点是否展开等,在自定义的组件中通过这些属性,做出友好的用户交互效果。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script>
      var arr = [
        { id: 0, pid: null, text: "父级" },
        { id: 1, pid: 0, text: "一级1" },
        { id: 2, pid: 0, text: "一级2" },
        { id: 3, pid: 1, text: "二级1-1" },
        { id: 4, pid: 1, text: "二级1-2" },
        { id: 5, pid: 2, text: "二级2-1" },
        { id: 6, pid: 2, text: "二级2-2" },
        { id: 7, pid: 3, text: "三级1-1-1" },
        { id: 8, pid: 7, text: "四级1-1-1-1" },
        { id: 9, pid: 8, text: "五级1-1-1-1-1" },
        { id: 10, pid: 9, text: "六级1-1-1-1-1" },
      ];
      let arrayToTree = function (dataArr, rootId) {
        let arr = JSON.parse(JSON.stringify(dataArr));
        // 获取所有顶级分类,然后组成数组
        let parents = arr.filter((v) => v.pid === rootId);
        // 获取所有非顶级分类,组成数组
        let children = arr.filter((v) => v.pid !== rootId);
        // 定义递归方法, 传入参数,父级数组,和子集数组
        function dataToTree(p, c) {
          // 循环遍历父级数组
          p.forEach((p_v) => {
            // 循环遍历子集数组
            p_v.isOpen = false;
            c.forEach((c_v, c_i) => {
              // 判断当前的子项是否为当前的父项的子元素
              if (c_v.pid === p_v.id) {
                // 如果是那么判断当前,当前父类项是否有children 字段
                if (!p_v.children) {
                  // 如果没有初始化为空数组
                  p_v.children = [];
                  c_v.isLeaf = true;
                }
                // 然后把当前的子类项推到父类的children数组中
                p_v.children.push(c_v);
                // 在执行递归调用当前方法,把当前子类项以数组的形式作为第一个参数传入,然后把所有的子集数组作为第二个参数传入,从新遍历所有子类数组中是否有当前子类的下一级
                // dataToTree([c_v], children);
                p_v.isLeaf = false;
                c_v.isLeaf = true;
                /* 为了减少遍历的次数可以把当前项从子类型中删除 */
                // 然后把所有的子集数组深拷贝一份,因为数组中的项是对象属于引用类型的
                let _c = JSON.parse(JSON.stringify(c));
                //然后把当前子类项从整体的子类数组中剔除
                _c.splice(c_i, 1);
                // 在执行递归调用当前方法,把当前子类项以数组的形式作为第一个参数传入,然后把所有的子集数组作为第二个参数传入,从新遍历所有子类数组中是否有当前子类的下一级
                dataToTree([c_v], _c);
              }
              c_v.isOpen = false;
            });
          });
        }
        dataToTree(parents, children);
        return parents;
      };
      let getTree = arrayToTree(arr, null);
      console.log(getTree);
    </script>
  </head>
  <body></body>
</html>

原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/array-to-tree-js.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
上一篇 2022年11月9日
下一篇 2022年11月10日

相关推荐

  • Java自学之抽象类与接口

    面向对象程序设计中,类继承的主要作用的扩充已有类的功能。子类可以根据自己的需要选择是否要覆写父类中的方法,所以一个设计完善的父类是无法对子类做出任何强制性的覆写约定。为了解决这样的…

    2020年12月7日
    1.3K
  • MySQL数据库基础之视图及触发器相关知识点整理

    视图的操作 视图,本质上是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值形式存在。行和列数据来自自定义视图的查询所引用基本…

    2020年7月13日
    1.4K
  • Spring Tools学习之JAVA开发环境搭建【windows 10】

    一直以来都想学习JAVA,但是苦于找不到门路,网上学习资料要不看不懂,要不需要金钱。 终于,迫于生活与年龄的压力,下定决心,学习JAVA。 写下此文档,记录一下自己学习JAVA之路…

    2018年12月6日
    2.9K
  • 外层有一个自适应高度的div,里面有两个div,一个高度固定300px,另一个怎么填满剩余的高度?

    可以设置外层自适应高度的容器为flex布局,利用flex-basis属性即可实现自动填满剩余高度;代码如下:

    2021年2月22日
    1.3K
  • windows 11 如何安装Docker Desktop

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化…

    2022年10月27日
    532
  • 如何搭建MyBatis开发环境

    进入一段时间的学习及温习,已经可以说是初步掌握了Javaweb入门开发,由于我的中心思想是抛弃JSP,做纯粹的前后端分离项目,所以接下来计划学习持久层开发,现在主流的持久层开发工具…

    2022年4月6日
    792
  • Spring Boot的常用注解

    未来的框架趋势是“约定大于配置”,代码的封装会更加严密。开发人员会将更多的精力放在代码的整体优化和业务逻辑上,所以注解式编程会被更加广泛地使用。那么什么是注解?Spring Boo…

    2024年8月29日
    415
  • 5分钟带你入门vuex(vue状态管理)

    如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那…

    2019年11月5日
    2.1K
  • flex布局详解

    往往在移动端开发过程中,弹性布局是非常实用的一种手段。往往你并不需要去反复的使用媒体查询的。整整的响应式布局是使界面能够自动的根据屏幕进行变化,做到完美的弹性布局,在必要的时候,去…

    2018年9月10日
    2.3K
  • Java自学之I/O编程

    I/O(Input/Output,输入/输出)可以实现数据的读取与写入操作,Java针对I/O操作的实现提供了java.io工具包,此包的核心组成由File类、InputStrea…

    2020年12月21日
    1.3K