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日

相关文章

  • VueJs单页应用实现微信网页授权及微信分享功能示例

    下面我来为你详细讲解“VueJs单页应用实现微信网页授权及微信分享功能示例”的完整攻略。 简介 微信网页授权和微信分享功能是开发微信公众号和小程序时常用的功能,本文将介绍如何在VueJS单页应用中实现这两个功能。 微信网页授权 在公众平台中注册一个微信公众号,并且在公众号设置中添加JS接口安全域名,否则无法使用微信JS-SDK功能。 在网页中引入微信JS-S…

    JavaScript 2023年6月11日
    00
  • JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)

    在JavaScript中,可以使用new Date(str)语法将一个字符串转换为Date对象,其中str是日期字符串。但是在使用火狐或者IE浏览器时,可能会出现兼容性问题,如果字符串的格式不是标准的ISO格式(YYYY-MM-DDTHH:mm:ss.sssZ),就会出现错误。 以下是两种解决方法: 方法一:使用正则表达式修改日期字符串格式 可以使用正则表达…

    JavaScript 2023年6月10日
    00
  • javascript格式化json显示实例分析

    接下来我将为你详细讲解“JavaScript格式化JSON显示实例分析”的完整攻略。 什么是JSON JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换格式。JSON使用文本来描述数据对象,与XML不同,JSON更容易阅读、编写、解析,因为它的语法格式比XML更简洁。 格式化JSON 在处理JSON格式的数据时,我们…

    JavaScript 2023年5月27日
    00
  • 使用JavaScript正则表达式如何去掉双引号

    当我们需要使用JavaScript去掉字符串中的双引号时,可以使用正则表达式来实现。下面是具体的步骤: 1. 使用正则表达式替换方式 JavaScript的字符串replaceAll()方法可以接收两个参数,第一个参数表示需要替换的字符串,第二个参数则表示用来替换的字符串。我们可以将第二个参数设置为空字符串,就可以实现去掉双引号的效果。 下面是一个示例: c…

    JavaScript 2023年6月10日
    00
  • 原生JavaScript编写俄罗斯方块

    编写俄罗斯方块是一个非常有趣和实用的JavaScript项目。以下是一些步骤和示例代码,可以帮助您开始编写自己的俄罗斯方块游戏。 步骤一:创建HTML文件 首先,我们需要创建一个HTML文件,在其中添加一个canvas元素来展示俄罗斯方块游戏。以下是一个示例HTML文件: <!DOCTYPE html> <html> <head…

    JavaScript 2023年6月10日
    00
  • JavaScript 动态三角函数实例详解

    JavaScript 动态三角函数实例详解 引言 本文将详细讲解如何使用JavaScript实现动态三角函数。三角函数是数学中的重要概念,而动态三角函数则是将三角函数与图形可视化相结合的效果,将这种效果实现在Web应用程序中,离不开JavaScript的帮助。 必要的准备工作 在本例中,我们将使用HTML、CSS和JavaScript来实现三角函数。打开你的…

    JavaScript 2023年5月27日
    00
  • js下写一个事件队列操作函数

    下面是详细讲解“js下写一个事件队列操作函数”的完整攻略。 什么是事件队列? 事件队列是 JavaScript 中用于管理异步任务的机制。异步任务例如 Ajax 请求、setTimeout、setInterval 等,这些任务会在一个单独的线程中执行,不会与页面渲染等同步任务同时进行,因此对于编写高效、优化的 JavaScript 代码十分重要。 编写一个事…

    JavaScript 2023年5月28日
    00
  • JS内置对象和Math对象知识点详解

    JS内置对象和Math对象知识点详解 1. JS内置对象 JavaScript内置对象是指ecmaScript规范定义的对象,这些对象全局可用。JS内置对象不需要额外定义就可以直接使用,并且拥有丰富的API。 1.1. 常见的JS内置对象 以下是一些常见的JS内置对象: String 对象用于处理文本字符串 Number 对象用于处理数字 Object 对象…

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