js实现数组转树示例

下面是详细讲解“JS实现数组转树示例”的攻略:

什么是数组转树

数组转树是将一个平铺的数组转换成一颗树形结构,该过程通常用于前端渲染树形结构。通常一个具有父子关系的数据明显都有一个parent和children属性,通常这种结构主要应用于分类、目录等有层级结构的数据类型中,例如文件夹、部门机构等。对于这种关系型结构数据,前后端常用的数据传输包括json格式和xml格式。

数组转树的过程

数组转树的过程分为两个步骤:

  1. 遍历数组,构造每个树节点的基本属性。
  2. 把构造出来的节点组织成树节点结构。

其中,遍历为整个数组,在循环过程中,我们对于树节点进行实例化,每个树节点具有四类基本属性

  • 节点编号
  • 父节点编号
  • 当前节点对象
  • 孩子节点数组

接下来我们就来分别进行实现:

构造每个树节点的基本属性

我们要构造每个树节点的基本属性,于是我们遍历这个数组,并且进行以下操作:

  • 把每个节点实例化为一个具有编号、自身对象、父亲节点、儿子节点属性的节点对象,并存入一个对象中。
  • 利用每个节点自带的父亲节点编号,把该节点加进该节点的父亲的儿子节点数组中。
  • 对于根节点,我们规定其父亲节点编号为0,通过分类来处理孩子节点,
    具体实现代码如下:
function arrayToTree(array) {
   var result = [];
   var map = {};
   for(var i=0;i<array.length;i++){
      var node = array[i];
      node.children = []; // 孩子节点数组
      map[node.id] = node; // 存储节点编号和节点对象映射
   }
   for(var i=0;i<array.length;i++){
      var node = array[i];
      if(node.parentId !== 0){
         var parent = map[node.parentId];
         if(parent){
            parent.children.push(node); // 给父亲节点的儿子节点数组添加每个节点
         }
      }else {
         result.push(node); // 根节点添加到结果中
      }
   }
   return result;
}

把构造的节点组织成树节点结构

构造完每个树节点的基本属性后,我们需要把每个节点按照其层级、节点编号、父节点编号等从底层到顶层依次组织成一个树结构:

function arrayToTree(array) {
   var result = [];
   var map = {};
   for(var i=0;i<array.length;i++){
      var node = array[i];
      node.children = []; // 孩子节点数组
      map[node.id] = node; // 存储节点编号和节点对象映射
   }
   for(var i=0;i<array.length;i++){
      var node = array[i];
      if(node.parentId !== 0){
         var parent = map[node.parentId];
         if(parent){
            parent.children.push(node); // 给父亲节点的儿子节点数组添加每个节点
         }
      }else {
         result.push(node); // 根节点添加到结果中
      }
   }
   return result;
}

示例说明

实例1:基于分类的数组转树

假设我们有如下申请单分类的数据结构,该结构为一个数组,每个子类对象有一个分类编号,一个父类编号和一个分类名称:

var data = [
   {id: 1, parentId: 0, name: '申请单'},
   {id: 2, parentId: 1, name: '条件'},
   {id: 3, parentId: 1, name: '图像'},
   {id: 4, parentId: 1, name: '文件'},
   {id: 5, parentId: 2, name: '数量'},
   {id: 6, parentId: 3, name: '分辨率'},
   {id: 7, parentId: 4, name: '大小'}
];

我们用上面的代码将该数组转换成树节点结构如下所示:

{
   id: 1,
   parentId: 0,
   name: '申请单',
   children: [
      {
         id: 2,
         parentId: 1,
         name: '条件',
         children: [
            {
               id: 5,
               parentId: 2,
               name: '数量',
               children: []
            }
         ]
      },
      {
         id: 3,
         parentId: 1,
         name: '图像',
         children: [
            {
               id: 6,
               parentId: 3,
               name: '分辨率',
               children: []
            }
         ]
      },
      {
         id: 4,
         parentId: 1,
         name: '文件',
         children: [
            {
               id: 7,
               parentId: 4,
               name: '大小',
               children: []
            }
         ]
      }
   ]
}

实例2:基于产品属性的数组转树

假设我们有如下颜色、尺寸、版本三种产品属性,该结构为一个数组,每个子类对象有一个分类编号、一个父类编号和一个分类名称:

var data = [
   {id: 1, parentId: 0, name: '产品'},
   {id: 2, parentId: 1, name: '免打孔'},
   {id: 3, parentId: 1, name: '挂钩'},
   {id: 4, parentId: 1, name: '鞋带'},
   {id: 5, parentId: 2, name: '颜色'},
   {id: 6, parentId: 2, name: '尺寸'},
   {id: 7, parentId: 2, name: '版本'},
   {id: 8, parentId: 5, name: '黑色'},
   {id: 9, parentId: 5, name: '白色'},
   {id: 10, parentId: 6, name: '35-36码'},
   {id: 11, parentId: 6, name: '37-38码'},
   {id: 12, parentId: 7, name: 'S'},
   {id: 13, parentId: 7, name: 'M'},
   {id: 14, parentId: 7, name: 'L'}
];

我们用上面的代码将该数组转换成树节点结构如下所示:

{
   id: 1,
   parentId: 0,
   name: '产品',
   children: [
      {
         id: 2,
         parentId: 1,
         name: '免打孔',
         children: [
            {
               id: 5,
               parentId: 2,
               name: '颜色',
               children: [
                  {
                     id: 8,
                     parentId: 5,
                     name: '黑色',
                     children: []
                  },
                  {
                     id: 9,
                     parentId: 5,
                     name: '白色',
                     children: []
                  }
               ]
            },
            {
               id: 6,
               parentId: 2,
               name: '尺寸',
               children: [
                  {
                     id: 10,
                     parentId: 6,
                     name: '35-36码',
                     children: []
                  },
                  {
                     id: 11,
                     parentId: 6,
                     name: '37-38码',
                     children: []
                  }
               ]
            },
            {
               id: 7,
               parentId: 2,
               name: '版本',
               children: [
                  {
                     id: 12,
                     parentId: 7,
                     name: 'S',
                     children: []
                  },
                  {
                     id: 13,
                     parentId: 7,
                     name: 'M',
                     children: []
                  },
                  {
                     id: 14,
                     parentId: 7,
                     name: 'L',
                     children: []
                  }
               ]
            }
         ]
      },
      {
         id: 3,
         parentId: 1,
         name: '挂钩',
         children: []
      },
      {
         id: 4,
         parentId: 1,
         name: '鞋带',
         children: []
      }
   ]
}

希望这些说明对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现数组转树示例 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JS中async/await实现异步调用的方法

    那么我们来详细讲解下JS中async/await实现异步调用的方法。 使用场景 在JS中,异步调用是很常见的需求。异步调用通常指的是请求服务器数据、操作浏览器本地存储、读取文件等这样一些会长时间阻塞JS的操作。这些操作通常要用到回调函数处理异步操作结果。而使用async/await可以让异步操作更加简单、直观,避免了回调地狱的问题。 Async/await工…

    JavaScript 2023年6月11日
    00
  • cesium-2-entity

    1、四层结构 viewer –> datasources(DataSourceCollection类型) –> datasource –> entities(EntityCollection类型) –> entity 需要学习的方向是:只需要注意每个层与层之间的关系和entity实例如何创建即可 2、DataSourceCol…

    JavaScript 2023年4月27日
    00
  • 5天学会asp

    5天学会ASP完整攻略 ASP是一种基于服务器端脚本语言的Web开发技术,使用ASP可以轻松构建动态网站和Web应用程序。如果你想在5天时间内掌握ASP技术,下面是具体的学习攻略: Day 1:入门 先了解ASP的基础知识,可以查看一些相关的文章或者教程,例如MDN web文档等 安装IIS(Internet Information Services)Web…

    JavaScript 2023年6月10日
    00
  • 创建与框架无关的JavaScript插件

    创建与框架无关的JavaScript插件,需要考虑以下关键要点: 1. 避免与全局命名空间冲突 在创建插件时,应尽可能避免使用全局命名空间中已存在的变量和函数。可以通过创建一个伪命名空间,将插件中的所有变量和函数保存在其中,并确保不会与其他脚本发生冲突。 var MyPlugin = (function() { // 插件的代码放在这里… })(); 2…

    JavaScript 2023年6月11日
    00
  • JS Loading功能的简单实现

    下面是详细讲解“JS Loading功能的简单实现”的完整攻略。 什么是JS Loading功能? JS Loading功能是指在网页中通过异步加载JavaScript文件,避免了网页在加载JavaScript资源时阻塞其他资源,提高了网页的响应速度和用户体验。 如何实现JS Loading功能? 在实现JS Loading功能时,可以采用如下的步骤: 创建…

    JavaScript 2023年6月11日
    00
  • js实现数组转换成json

    要实现将数组转换成JSON格式,我们需要使用Javascript内置的JSON对象来进行转换操作。下面是实现数组转换成JSON的完整攻略: 1. 了解JSON对象 在Javascript中,JSON是一个对象,用于处理JSON格式的数据。JSON对象拥有两个方法:stringify()和parse()。stringify()将Json对象转换为json字符串…

    JavaScript 2023年5月27日
    00
  • Javascript Date setUTCSeconds() 方法

    以下是关于JavaScript Date对象的setUTCSeconds()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的setUTCSeconds()方法 JavaScript的setUTCSeconds()方法设置UTC秒部分。该方法接受一个整数,表示要设置的UTC秒数。如果该参数超出了JavaScript所能表示的范,则自动调…

    JavaScript 2023年5月11日
    00
  • JavaScript简单生成 N~M 之间随机数的方法

    Javascript 中生成随机数主要依赖于Math对象的两个方法:Math.random()和Math.floor()。 一、使用方法 Math.random()方法可以生成0到1的随机数,包含0但不包含1。 Math.floor()方法将小数向下取整,例如Math.floor(3.9)为3。 利用这两个方法,我们可以生成一个指定范围内的随机数: Math…

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