js实现数组转树示例

yizhihongxing

下面是详细讲解“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日

相关文章

  • Javascript 代码也可以变得优美的实现方法

    代码结构 在书写Javascript代码时,应该保持代码的结构清晰,统一。一个好的代码结构可以方便后续的代码维护,同时也符合阅读习惯。 在注释方面,适当的加入注释可以增加代码的可读性。注释内容应该清晰、简洁,涵盖对代码的主要解释和功能说明。 变量声明 在声明变量时,应该使用 var 或 let 关键字。其中 var 声明的变量为全局变量,而 let 声明的变…

    JavaScript 2023年5月18日
    00
  • 一文搞懂 parseInt()函数异常行为

    下面是详细讲解 “一文搞懂 parseInt() 函数异常行为” 的完整攻略: 简介 在 JavaScript 中,parseInt 函数用于将字符串转换成整数类型。然而,这个函数存在一些异常行为,尤其是在处理字符串中包含的非数字字符时。本文将深入探讨 parseInt 函数的异常行为,并提供一些解决方法。 parseInt() 函数异常行为 解析整数值 p…

    JavaScript 2023年5月28日
    00
  • 深入理解函数执行上下文 this

    当JavaScript代码执行时,每个函数的执行都会创建一个执行上下文(Execution Context),用于管理函数执行的环境和数据。函数执行上下文包括函数的作用域链、变量对象、this指针等。 而本文将重点讲解this指针在函数执行上下文中的工作原理和相关注意事项。 1. this指针的机制 this是一个特殊的关键字,用于访问当前函数执行上下文绑定…

    JavaScript 2023年6月11日
    00
  • Javascript函数技巧学习

    下面是详细的讲解“JavaScript函数技巧学习”的完整攻略。 一、入门和基础知识 首先需要熟悉JavaScript函数基础知识,例如函数的定义、调用、参数、返回值等。同时需要了解函数作用域、闭包、箭头函数等高级概念。 二、函数式编程 掌握函数式编程是成为JavaScript高手的必要技能。函数式编程通过组合函数和避免副作用来提高代码的可读性和可维护性,使…

    JavaScript 2023年5月17日
    00
  • js将URL网址转为16进制加密与解密函数

    下面就是“js将URL网址转为16进制加密与解密”的完整攻略: 1. 前置知识 在开始本攻略前,需要你掌握以下两个方面的知识: JavaScript基础语法:至少需要懂基本的变量声明、流程控制等语法。 URL编码和解码:需要了解URL编码和解码的原理及JavaScript中对应的方法。 2. 加密函数实现 下面给出一个将URL网址转为16进制加密的函数实现:…

    JavaScript 2023年5月19日
    00
  • Javascript Date setUTCHours() 方法

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

    JavaScript 2023年5月11日
    00
  • javascript导出csv文件(excel)的方法示例

    下面是关于“javascript导出csv文件(excel)的方法示例”的完整攻略: 一、CSV文件格式介绍 CSV(Comma-Separated Values)就是指逗号分隔符,通常是一种保存矩阵数据的文件格式。每行记录表示一行,以逗号作为分隔符,不同列数据存在不同位置,可以通过表格对齐的方式方便地分辨出来。 例如:下面是一个CSV文件的模板: 姓名,学…

    JavaScript 2023年5月27日
    00
  • ASP.NET搭配Ajax实现搜索提示功能

    ASP.NET是一种用于构建动态网站和Web应用程序的框架。它可以与AJAX(异步JavaScript和XML)结合使用来实现各种功能,其中之一是搜索提示功能。 搜索提示功能允许用户输入关键字时,动态地显示相关联的结果。这种实时反馈可以提高用户的操作效率和用户体验。 以下是使用ASP.NET和AJAX实现搜索提示功能的完整攻略: 创建ASP.NET Web应…

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