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日

相关文章

  • JS两个数组比较,删除重复值的巧妙方法(推荐)

    JS两个数组比较,删除重复值是一个常见的问题。以下是一个使用巧妙方法的攻略: 步骤1:创建两个待比较的数组 首先,您需要定义两个数组,分别是要比较的源数组和目标数组。例如: const sourceArray = [1, 2, 3, 4, 5]; const targetArray = [3, 4, 5, 6, 7]; 步骤2: 使用filter方法进行比较…

    JavaScript 2023年6月11日
    00
  • JS实现新建文件夹功能

    下面我们来讲解一下JS实现新建文件夹的功能的完整攻略。 1. 前置知识 在开始阐述具体实现方法之前,我们先简单介绍一下一些前置知识: HTML: 用于搭建页面结构 CSS: 用于美化页面样式 JavaScript(JS): 在页面中增加交互动态效果 其中,前两项是每个Web开发者的基本功,这里不再赘述,主要介绍JS的相关知识。 JS通常用于给页面添加动态交互…

    JavaScript 2023年5月27日
    00
  • 利用js正则表达式验证手机号,email地址,邮政编码

    对于利用js正则表达式验证手机号、email地址、邮政编码,可以按照以下步骤进行: 一、编写正则表达式 验证手机号 手机号码一般为11位数字组成,以1开头,比较简单,可以使用以下正则表达式进行匹配: /^1[3456789]\d{9}$/ 该表达式的解释: ^ 为开始符号,表示匹配输入的开始 1 为手机号码开头的数字,即必须以1开头 [3456789] 表示…

    JavaScript 2023年5月19日
    00
  • WebRTC媒体权限申请getUserMedia实例详解

    WebRTC媒体权限申请getUserMedia实例详解 WebRTC 是一个支持浏览器进行实时语音和视频通信的技术,该技术支持在浏览器中进行点对点的实时通信,如音视频聊天、语音识别等。其中要求涉及到媒体流的获取、媒体流的处理和媒体流的展示,其中媒体权限申请可以使用 getUserMedia 接口实现。 什么是 getUserMedia 接口? getUse…

    JavaScript 2023年6月11日
    00
  • js变换显示图片的实例

    下面我来为您详细讲解“js变换显示图片的实例”的完整攻略: 1. 具体实现步骤 1.1 前置条件 在页面上需要添加一个<img>标签用于显示图片,以及若干个用于触发变换的元素(按钮、超链接等)。 1.2 HTML结构 在<img>标签中需要设置好初始的图片路径,如下所示: <img id="img1" src…

    JavaScript 2023年6月11日
    00
  • jquery validate添加自定义验证规则(验证邮箱 邮政编码)

    以下是关于jquery validate添加自定义验证规则的完整攻略。 什么是jquery validate? jQuery validate是一个基于jQuery的表单验证插件,它可以对表单中的各类数据进行校验,从而帮助我们减少了客户端数据校验的代码量,提高了开发效率。 如何添加自定义验证规则? jquery validate插件提供了丰富的内置验证规则,…

    JavaScript 2023年6月10日
    00
  • JavaScript常见手写题超全汇总

    JavaScript常见手写题超全汇总 1. 前言 在面试以及实际工作中,常常需要手写一些核心的JavaScript代码。这些手写题目可能比较简单、或者非常复杂,但是它们都对JavaScript基础功夫有一个更加深刻的理解。 在本篇文章中,我们将会汇总一些常见的JavaScript手写题,包括但不限于:数组去重、深拷贝、Promise实现、函数柯里化等等。 …

    JavaScript 2023年5月18日
    00
  • 正则表达式搭配js轻松处理json文本方便而老古

    正则表达式搭配JS轻松处理JSON文本方便而老古 什么是正则表达式? 正则表达式是一种用于描述字符串模式的语法,通过使用简洁而强大的语法规则,可以在文本匹配、搜索、替换、验证等方面提供非常高效和灵活的处理方式。 如何在JavaScript中使用正则表达式处理JSON文本? JSON(JavaScript Object Notation)是一种轻量级的数据交换…

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