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

yizhihongxing

让我们来详细讲解“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 Array valueOf 方法

    以下是关于JavaScript Array valueOf方法的完整攻略。 JavaScript Array valueOf方法 JavaScript Array valueOf方法用于返回数组本身。该方法返回的是数组对象本身,而不是数组中的元素。 下面是一个使用valueOf方法的示例: var arr = [1, 2, 3, 4, 5]; console…

    JavaScript 2023年5月11日
    00
  • 前端工程师新手必读:掌握网页设计的基本技能和弄清设计的概念

    前端工程师新手必读:掌握网页设计的基本技能和弄清设计的概念 理解设计的概念 在进行网页设计之前,需要先理解设计的概念。设计不仅仅是美的堆砌,而是需要达到清晰、简洁、易用、美观的效果。一个好的设计,要能够吸引用户的眼球,也要让用户可以方便地使用。 其中,设计的前提条件是对用户和品牌的深入了解。根据产品性质,合理规划内容布局和视觉结构。在设置页面元素时,遵循一定…

    JavaScript 2023年5月19日
    00
  • IE8 原生JSON支持

    IE8 原生 JSON 支持是指 Internet Explorer 8(IE8)浏览器中自带了对 JSON 数据格式的支持。在 IE8 之前的版本中,如果要使用 JSON 格式的数据,需要引入第三方库来解析或者手写解析函数。而在 IE8 中,开发者可以直接使用浏览器提供的全局对象 JSON 来解析和序列化 JSON 格式的数据,无需引入其他库。 为了使用 …

    JavaScript 2023年5月27日
    00
  • JavaScript面向对象之深入了解ES6的class

    一、JavaScript面向对象JavaScript是一种弱类型语言,不支持类的概念,但是JavaScript可以通过对象、原型和构造函数等方式模拟类的概念。在JavaScript中,对象是一个属性的集合,可以通过点语法或方括号语法来访问对象中的属性和方法。同时,JavaScript还支持原型继承。继承是指对象可以继承其他对象中的属性和方法,这种继承是通过原…

    JavaScript 2023年5月27日
    00
  • JS获取当前时间戳方法解析

    JS获取当前时间戳方法解析 在JavaScript中,我们可以使用多种方法来获取当前的时间戳。本文将会介绍其中比较常用的三种方法:使用Date对象、使用时间戳函数和使用性能API。 使用Date对象 Date对象是JavaScript中提供的一个内置对象,我们可以通过该对象获取当前的时间戳。Date对象的getTime方法会返回一个13位的时间戳,以毫秒为单…

    JavaScript 2023年5月27日
    00
  • Fuse.js模糊查询算法学习指南

    Fuse.js模糊查询算法学习指南 算法简介 Fuse.js是一款用于快速模糊搜索的JavaScript库。它使用了一种称为模糊查询算法的算法,能够在无需进行复杂的文件预处理或搜索索引的情况下,在大量数据中高效地进行模糊搜索。 Fuse.js算法的流程如下: 初始化:将查询的关键字转化为需要搜索的模式。 评估:根据搜索模式计算每个文本的匹配程度。 排序:将文…

    JavaScript 2023年6月11日
    00
  • javascript模拟滚动条实现代码

    下面是详细的Javascript模拟滚动条实现代码攻略以及两个具体示例: 理解模拟滚动条实现的基本思路 在网页中,我们经常需要显示超过页面高度的内容,比如文章、图片、列表等。这些内容通常会被放在容器元素中(比如 <div>)中,而这个容器元素则设置了特定的高度和 overflow: scroll 样式,以便自动显示出垂直方向的滚动条。 本质上,模…

    JavaScript 2023年5月27日
    00
  • html格式化输出JSON示例(测试接口)

    请注意,本攻略中,我们默认你已经了解了markdown基础语法,知道如何书写标题、代码块等。 什么是“html格式化输出JSON示例”? “html格式化输出JSON示例”是一个测试接口,其主要的功能是以HTML格式渲染JSON数据。该接口支持跨域访问,并且可以很方便地作为调试工具来使用。 如何使用该接口? 该接口的URL为https://www.coola…

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