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日

相关文章

  • JavaScript封装的常用工具类库bee.js用法详解【经典类库】

    JavaScript封装的常用工具类库bee.js用法详解【经典类库】 1. 什么是bee.js bee.js是一款小而美的JavaScript工具类库,它提供了众多常用的功能函数,例如类型判断、DOM操作、数据结构等。它被设计成符合模块化开发思想,可以轻松集成到各种前端框架和项目中。 2. bee.js的安装和引入 你可以通过npm安装bee.js npm…

    JavaScript 2023年5月28日
    00
  • Javascript中对象继承的实现小例

    Javascript中对象继承的实现小例 实现对象继承的方式有很多种,包括原型链继承、借用构造函数继承、组合继承等。本例介绍如何通过原型链继承的方式实现对象的继承。 原型链继承 原型链继承是一种简单、易懂的继承方式。它的基本原理是:通过将子类的原型设置为父类的实例,子类就可以继承父类的实例属性和方法。 具体来说,我们可以先定义一个父类MyClass,再定义一…

    JavaScript 2023年5月27日
    00
  • 详解JavaScript中常用操作符的使用

    详解JavaScript中常用操作符的使用 前言 JavaScript中操作符是用来执行各种计算操作的符号,不同的操作符有不同的用途和优先级。在编写JavaScript程序时,我们需要了解各种操作符的使用方法和规则。本文将详细介绍JavaScript中常用操作符的使用。 算术操作符 算术操作符是用于执行基本的算术计算,如加减乘除等操作。下面是常用的算术操作符…

    JavaScript 2023年5月27日
    00
  • 浅谈javascript中onbeforeunload与onunload事件

    当用户即将关闭页面或者离开当前页面时,JavaScript中提供了两个常见的事件:onbeforeunload和onunload。 onbeforeunload事件 onbeforeunload事件会在页面关闭或者刷新之前触发,它可以用来提示用户保存数据或者进行其他的操作。这个事件触发后,浏览器会弹出一个确认对话框,询问用户是否确定要离开当前页面。 以下是o…

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

    当你开始学习JavaScript时,你会发现这是一项非常有用的技能,它可以帮助你开发互联网应用、增强网站的用户体验,并向你展示计算机编程的基本原理。但是,对于初学者来说,学习JavaScript可能很难,也可能令人失望。下面是一些学习JavaScript的技巧和方法。 选择一本好的学习JavaScript的书籍 对于初学者来说,选择一本好的JavaScrip…

    JavaScript 2023年5月18日
    00
  • JavaScript如何生成二维数组

    生成二维数组的过程,实际上就是创建一个包含其他数组的数组。这个过程也可以称之为多维数组的创建。在 JavaScript 中,可以通过以下几种方法来生成二维数组: 方法一:使用双重循环创建二维数组 let rows = 5; let cols = 4; let arr = new Array(rows); for (let i = 0; i < rows…

    JavaScript 2023年5月28日
    00
  • Javascript模仿淘宝信用评价实例(附源码)

    下面我来详细讲解“Javascript模仿淘宝信用评价实例(附源码)”的完整攻略。 首先,该实例主要是通过Javascript实现了一个简单的淘宝信用评价功能。用户可以通过点击不同的星星来进行评分,然后根据评分的不同,会有不同的反馈信息和评价结果。该实例的源码已经公开,可以在Github上获取。 接下来,我们来看具体的实现过程。首先,我们需要为页面添加一些基…

    JavaScript 2023年6月11日
    00
  • js获取当前日期前七天的方法

    要获取当前日期前七天的方法,可以使用JavaScript中的Date对象进行操作。以下是具体步骤: 步骤 1:获取当前日期 使用JavaScript内置的Date对象,可以获取当前的年月日。 const today = new Date(); const year = today.getFullYear(); const month = today.getM…

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