js将列表组装成树结构的两种实现方式分享

让我们来详细讲解“js将列表组装成树结构的两种实现方式分享”的完整攻略。

1. 背景

在开发网站时,经常会遇到需要将列表数据组装成树形结构的需求。比如,某个商品分类下有多个子分类,子分类又有自己的子分类,这就是一棵树形结构。如果我们只有一份列表数据,该如何将它组装成一棵树呢?

2. 实现方式一:递归

2.1 实现思路

递归是一种非常自然且直观的方法,它通过不断地调用自己,将列表数据转换成树形结构。具体实现过程如下:

  1. 遍历列表数据,找到顶层节点;
  2. 针对每个顶层节点,递归地查找其子节点,直到没有子节点为止;
  3. 将顶层节点和其子节点组装成一棵树。

2.2 示例说明

假设有如下的一个列表数据,它表示某个商品分类下的所有子分类(包括子分类的子分类):

const categoryList = [
  { id: 1, name: '家用电器', parentId: 0 },
  { id: 2, name: '手机数码', parentId: 0 },
  { id: 3, name: '电视', parentId: 1 },
  { id: 4, name: '洗衣机', parentId: 1 },
  { id: 5, name: '空调', parentId: 1 },
  { id: 6, name: '华为', parentId: 2 },
  { id: 7, name: '小米', parentId: 2 },
  { id: 8, name: 'iphone', parentId: 2 },
  { id: 9, name: '智能手表', parentId: 2 },
  { id: 10, name: 'P30', parentId: 6 },
  { id: 11, name: 'Mate30', parentId: 6 },
  { id: 12, name: 'Note10', parentId: 7 }
];

通过递归的方式将它转换成树形结构的代码如下:

function buildTree(data, parentId) {
  const result = [];
  for (const item of data) {
    if (item.parentId === parentId) {
      const children = buildTree(data, item.id);
      if (children.length > 0) {
        item.children = children;
      }
      result.push(item);
    }
  }
  return result;
}

console.log(buildTree(categoryList, 0));

运行结果如下:

[
  {
    "id": 1,
    "name": "家用电器",
    "parentId": 0,
    "children": [
      {
        "id": 3,
        "name": "电视",
        "parentId": 1
      },
      {
        "id": 4,
        "name": "洗衣机",
        "parentId": 1
      },
      {
        "id": 5,
        "name": "空调",
        "parentId": 1
      }
    ]
  },
  {
    "id": 2,
    "name": "手机数码",
    "parentId": 0,
    "children": [
      {
        "id": 6,
        "name": "华为",
        "parentId": 2,
        "children": [
          {
            "id": 10,
            "name": "P30",
            "parentId": 6
          },
          {
            "id": 11,
            "name": "Mate30",
            "parentId": 6
          }
        ]
      },
      {
        "id": 7,
        "name": "小米",
        "parentId": 2,
        "children": [
          {
            "id": 12,
            "name": "Note10",
            "parentId": 7
          }
        ]
      },
      {
        "id": 8,
        "name": "iphone",
        "parentId": 2
      },
      {
        "id": 9,
        "name": "智能手表",
        "parentId": 2
      }
    ]
  }
]

3. 实现方式二:循环迭代

3.1 实现思路

循环迭代是一种相对较新的方法,它并不需要递归,而是通过遍历列表数据来构建树形结构。具体实现过程如下:

  1. 新建一个空数组,用来保存所有节点;
  2. 遍历列表数据,找到每个顶层节点,并将其塞入保存节点的数组中;
  3. 循环处理保存节点的数组,对于每一个节点,遍历列表数据,将其子节点塞入节点的children属性中;
  4. 如果节点的children属性不为空,将其子节点添加到保存节点的数组中。

3.2 示例说明

还是以上面的商品分类数据为例,通过循环迭代的方式将它转换成树形结构的代码如下:

function buildTree(data) {
  const map = {};
  const result = [];
  for (const item of data) {
    map[item.id] = { ...item, children: [] };
  }
  for (const item of data) {
    const node = map[item.id];
    if (item.parentId === 0) {
      result.push(node);
    } else {
      const parent = map[item.parentId];
      parent.children.push(node);
    }
  }
  return result;
}

console.log(buildTree(categoryList));

运行结果与递归方式相同,这里就不再赘述了。

4. 总结

递归和循环迭代都是将列表转换成树形结构的常用方法。两种方法各有优缺点,递归简单直观,但是可能会造成性能问题;循环迭代相对复杂,但是效率更高。开发者可以根据实际情况选择合适的方式来实现树形结构的转换。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js将列表组装成树结构的两种实现方式分享 - Python技术站

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

相关文章

  • javascript 面向对象技术基础教程第1/2页

    JavaScript 面向对象技术基础教程攻略 概述 JavaScript 是一门基于对象编程的语言。面向对象编程 (OOP) 是一种典型的编程范式,它将问题抽象成一系列对象,然后通过对象之间的交互解决问题。在 JavaScript 中,有许多实现面向对象编程的技术,如对象、类和原型等。在本教程中,我们将通过介绍这些技术,帮助读者在 JavaScript 中…

    JavaScript 2023年6月10日
    00
  • JS简单判断函数是否存在的方法

    当我们在编写JavaScript代码时,经常需要判断一个函数是否存在,以避免意外的“未定义”错误。以下是几种判断JavaScript函数是否存在的方法: 1. typeof typeof 运算符可以返回一个值的数据类型。如果一个变量的数据类型是函数,它的返回值将是 “function”。因此,我们可以使用 typeof 来判断一个函数是否存在: if (ty…

    JavaScript 2023年5月27日
    00
  • Android studio 混淆配置详解

    Android Studio 混淆配置详解 什么是混淆? 混淆(Proguard)是 Android 应用程序构建工具中的一个开源的代码缩减、优化和混淆工具。在编译 APK 文件的过程中,代码混淆可以将类名、方法名、变量名等一些敏感信息混淆成一个无法识别的字符串,以增加代码的安全性和减小 APK 大小。 如何进行混淆? 在 Android Studio 中进…

    JavaScript 2023年6月10日
    00
  • js 数组的for循环到底应该怎么写?

    JS 数组的 for 循环可用于遍历数组中的所有元素,并对每个元素进行操作。下面是 JS 数组的 for 循环的完整攻略: 1. 标准语法 使用 for 循环,可以直接对数组进行迭代,并采取一系列操作。循环主要依赖于条件语句,本例中表示当循环变量为 len 时,循环继续执行并打印所有元素的值。 var arr = ["a", "…

    JavaScript 2023年5月27日
    00
  • getElementByID、createElement、appendChild几个DHTML元素第2/2页

    针对这几个DHTML元素,我们一个一个来详细讲解。 getElementByID getElementByID 方法是用于通过 id 属性获取 HTML 元素的方法。它返回一个代表指定元素的对象。使用该方法时,需要在 HTML 元素上指定一个唯一的 id 属性,例如: <div id="example"></div&gt…

    JavaScript 2023年6月10日
    00
  • javascript比较两个日期的先后示例代码

    首先,比较两个日期的先后,在JavaScript中可以通过将两个日期对象(Date对象)转化为毫秒数,然后进行比较。具体步骤如下: 首先创建两个日期对象,可以通过传入参数的方式或者使用无参数的Date()构造函数来创建,示例如下: let date1 = new Date(‘2021-01-01’); let date2 = new Date(‘2021-0…

    JavaScript 2023年5月27日
    00
  • 基于JavaScript实现前端文件的断点续传

    首先,前端实现文件的上传需要使用HTML5新增的文件上传API,即File和FileReader对象。而实现文件的断点续传可以通过Ajax方式向后台传递文件分块,后台接口则可以将分块数据合并成完整的文件。 以下是一个完整的前端基于JavaScript实现文件的断点续传的攻略: 1. HTML页面设计 在HTML页面中需要添加一个文件上传的表单,和一个进度条用…

    JavaScript 2023年5月27日
    00
  • JScript中使用ADODB.Stream判断文件编码的代码

    请听我讲解“JScript中使用ADODB.Stream判断文件编码的代码”的完整攻略,主要包含以下几个步骤: 1. 引入ADODB.Stream对象 我们首先需要在JScript中引入ADODB.Stream对象,这个对象可以处理二进制数据。在引入之前需要确认系统中是否已经安装了Microsoft ActiveX Data Objects库,否则需要先安装…

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