一维数组结构数据转换树形结构数据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日

相关推荐

  • 函数防抖与函数节流

    函数防抖 定义 触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间;更直白一点就是:一个需要频繁触发的函数,在规定时间内,只让最后一次生效,…

    2020年7月17日
    1.5K
  • Vue项目中实现用户登录及token验证

    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 。 后端收到请求,验证用户名和密码,验证成功,就给…

    2019年8月8日
    5.1K
  • Webpack入门,模块打包原理分析

    面对工程中成百上千个模块,Webpack究竟是如何将它们有序地组织在一起,并按照开发者预想的顺序运行在浏览器上的呢?本篇文章将通过一个简单的示例。分析一下Webpack模块打包的原…

    2022年11月14日
    816
  • Java自学之类与对象

    定义 类是由成员属性和方法组成。成员属性主要定义类的一个具体信息,实际上一个成员属性就是一个变量,而方法是一些操作的行为。类的定义基础语法如下。 一个类定义完成后并不能够被直接使用…

    2020年11月25日
    1.3K
  • CSS多列等高布局

    在项目开发中,经常遇到需要多列等高布局的需求。解决这种的需求的方法有很多,各有利弊,现总结如下。 方法一:使用flex布局 优点:实现方便,还可以方便实现各种比例 ; 缺点: IE…

    2019年6月11日
    2.2K
  • 深入理解JS内存机制

    JS的内存机制在很多前端开发者看来并不是那么重要,但是如果你想深入学习JS,并将它利用好,打造高质量高性能的前端应用,就必须要了解JS的内存机制。对于内存机制理解了以后,一些基本的…

    2019年7月14日
    1.8K
  • JavaScript 事件委托详解

    基本概念 事件委托,通俗地来讲,就是把一个元素响应事件(click、keydown……)的函数委托到另一个元素; 一般来讲,会把一个或者一组元素的事件委托到…

    2021年3月8日
    1.2K
  • JavaScript基础知识八问

    JavaScript是前端开发中非常重要的一门语言,浏览器是他主要运行的地方。JavaScript是一个非常有意思的语言,但是他有很多一些概念,大家经常都会忽略。比如说,原型,闭包…

    2020年12月30日
    1.0K
  • 如何判断一个对象为数组

    使用 instanceof 操作符 原理 instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。 使用 instanceof 判断一个对象…

    2020年7月3日
    1.2K
  • Java自学之泛型

    在Java语言中,为了方便接收参数类型的统一,提供了核心类Object,利用此类对象可以接收所有类型的数据(包括基本数据类型和引用数据类型)。但是由于其所描述的数据范围过大,所以在…

    2020年12月8日
    1.3K