JavaScript递归算法生成树形菜单

yizhihongxing

生成树形菜单是前端开发中很常见的需求,而其中最常用的方法就是 JavaScript 递归算法。下面是一个完整的攻略:

1. 定义数据结构

在开始编写算法之前,我们需要确定菜单的数据结构。通常情况下,一棵树形结构的菜单包含以下属性:

  • id:节点的唯一标识符
  • name:节点的名称
  • children:子节点,也是一个数组,里面存放着若干个和父节点的结构相同的节点

利用该数据结构,我们可以构建出一棵如下的树形结构:

[
  {
    "id": 1,
    "name": "Home",
    "children": [
      {
        "id": 2,
        "name": "Products",
        "children": [
          {
            "id": 3,
            "name": "Mobile Phones",
            "children": [
              {
                "id": 4,
                "name": "iPhone 13"
              },
              {
                "id": 5,
                "name": "Samsung Galaxy S21"
              }
            ]
          },
          {
            "id": 6,
            "name": "Laptops",
            "children": [
              {
                "id": 7,
                "name": "MacBook Pro"
              },
              {
                "id": 8,
                "name": "Dell XPS 13"
              }
            ]
          }
        ]
      },
      {
        "id": 9,
        "name": "About Us"
      }
    ]
  }
]

2. 编写递归算法

接下来,我们开始编写 JavaScript 的递归算法。该算法的思路如下:

  1. 遍历树形结构中的每个节点
  2. 对于当前节点,创建一个新的菜单项
  3. 如果该节点包含子节点,则递归调用函数,将子节点作为新菜单项的子菜单,并添加到新菜单项的 children 属性中
  4. 将当前菜单项添加到菜单数组中
  5. 返回菜单数组

以下是具体实现:

function generateMenu(menuData) {
  let menu = [];
  for (let i = 0; i < menuData.length; i++) {
    let menuItem = {
      id: menuData[i].id,
      name: menuData[i].name
    };
    if (menuData[i].children) {
      menuItem.children = generateMenu(menuData[i].children);
    }
    menu.push(menuItem);
  }
  return menu;
}

在该算法中,我们首先定义了一个空数组 menu。接着,遍历树形结构中的每个节点,对于当前节点,创建一个新的菜单项 menuItem,然后判断该节点是否包含子节点。如果包含子节点,我们就递归调用该函数,并将得到的菜单项添加到当前菜单项的 children 属性中。最后,将当前菜单项添加到菜单数组中并返回菜单数组。

3. 嵌套列表

该算法生成的菜单可以很容易地转换成 HTML 代码。下面是一个嵌套列表的示例:

<ul>
  <li>
    <a href="#">Home</a>
    <ul>
      <li>
        <a href="#">Products</a>
        <ul>
          <li>
            <a href="#">Mobile Phones</a>
            <ul>
              <li><a href="#">iPhone 13</a></li>
              <li><a href="#">Samsung Galaxy S21</a></li>
            </ul>
          </li>
          <li>
            <a href="#">Laptops</a>
            <ul>
              <li><a href="#">MacBook Pro</a></li>
              <li><a href="#">Dell XPS 13</a></li>
            </ul>
          </li>
        </ul>
      </li>
      <li><a href="#">About Us</a></li>
    </ul>
  </li>
</ul>

4. Vue 组件

除了生成 HTML 代码,我们还可以将该算法封装成一个 Vue 组件,方便在 Vue 项目中使用。下面是一个示例:

<template>
  <ul>
    <li v-for="m in getMenuItems()" :key="m.id">
      <a :href="'#' + m.id">{{ m.name }}</a>
      <TreeMenu :menu-data="m.children" />
    </li>
  </ul>
</template>

<script>
export default {
  name: "TreeMenu",
  props: ["menuData"],
  methods: {
    getMenuItems() {
      if (!this.menuData) {
        return [];
      }
      return generateMenu(this.menuData);
    }
  },
  components: {
    TreeMenu: () => import("./TreeMenu.vue")
  }
};
</script>

在这个组件中,我们首先定义了一个 menuData 属性,接着使用一个 getMenuItems 方法生成菜单,并使用 v-for 指令展示每个菜单项。最后,我们将组件本身再次实例化,形成递归嵌套。该组件在使用时只需要传入菜单数据即可:

<template>
  <div>
    <TreeMenu :menu-data="menuData" />
  </div>
</template>

<script>
import TreeMenu from "./TreeMenu.vue";

export default {
  name: "App",
  data() {
    return {
      menuData: [
        {
          id: 1,
          name: "Home",
          children: [
            {
              id: 2,
              name: "Products",
              children: [
                {
                  id: 3,
                  name: "Mobile Phones",
                  children: [
                    {
                      id: 4,
                      name: "iPhone 13"
                    },
                    {
                      id: 5,
                      name: "Samsung Galaxy S21"
                    }
                  ]
                },
                {
                  id: 6,
                  name: "Laptops",
                  children: [
                    {
                      id: 7,
                      name: "MacBook Pro"
                    },
                    {
                      id: 8,
                      name: "Dell XPS 13"
                    }
                  ]
                }
              ]
            },
            {
              id: 9,
              name: "About Us"
            }
          ]
        }
      ]
    };
  },
  components: {
    TreeMenu
  }
};
</script>

以上就是使用 JavaScript 递归算法生成树形菜单的完整攻略,包含了数据结构的定义、递归算法的实现以及 HTML 和 Vue 组件的示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript递归算法生成树形菜单 - Python技术站

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

相关文章

  • [python简介]让我们在python中使用foreach

    下面是关于“[python简介]让我们在python中使用foreach”的完整攻略: 1. 什么是foreach 在Python中,foreach是一种循环结构,用于遍历列表、元组、字典等可迭代对象中的元素。foreach循环可以让我们更加方便地遍历列表、元组、字典等数据结构中的元素,从而更加高效地处理数据。 2. 如何使用foreach 在Python中…

    other 2023年5月7日
    00
  • VS2017+Qt5+Opencv3.4调用摄像头拍照并存储

    VS2017+Qt5+Opencv3.4调用摄像头拍照并存储 本篇攻略旨在介绍如何通过VS2017+Qt5+Opencv3.4实现调用摄像头拍照并将图片保存到本地。 硬件准备 首先需要一台PC并接入摄像头。 软件准备 Visual Studio 2017 Qt5 OpenCV 3.4 工程创建 打开Visual Studio 2017,选择Create a …

    other 2023年6月26日
    00
  • jsp 生命周期详细介绍

    JSP(JavaServer Pages)是一种用于创建动态网络应用程序的技术,它允许在 HTML 或 XML 文档中插入 Java 代码,JSP 在服务器上被解析和编译成正常的 HTML 页面。要深入了解 JSP 技术,需要对 JSP 生命周期进行详细介绍。本文将会对 JSP 生命周期进行详细讲解,并提供示例说明。 JSP 生命周期 JSP 生命周期是指 …

    other 2023年6月27日
    00
  • 关于go:在golang中为struct字段指定默认值

    以下是关于在Golang中为struct字段指定默认值的完整攻略,包括基本知识和两个示例。 基本知识 在Golang中,可以为struct字段指定默认值。这样,在创建struct实例时,如果没有为该字段指定值,则会使用默认值。在Golang中为struct字段指定默认值需要以下步骤: 在struct定义中为字段指定默认值 创建struct实例时,如果没有为该…

    other 2023年5月7日
    00
  • javascript中childnodes和children的区别

    当然,我可以为您提供有关“JavaScript中childNodes和children的区别”的完整攻略,以下是详细说明: 什么是childNodes和children? 在JavaScript中,childNodes和children都是用于访问元素的节点的属性。它们都返回一个节点列表,但它们之间有一些区别。 childNodes返回一个包含所有子节点的节…

    other 2023年5月7日
    00
  • MySQL中LIKE子句相关使用的学习教程

    MySQL中LIKE子句相关使用的学习教程 简介 在MySQL中,LIKE子句用于在查询中模糊匹配字符串。它可以帮助我们查找包含特定模式的数据。本教程将详细介绍MySQL中LIKE子句的使用方法,并提供两个示例说明。 语法 LIKE子句的基本语法如下: SELECT 列名 FROM 表名 WHERE 列名 LIKE ‘模式’; 示例1:查找以特定字符开头的数…

    other 2023年8月18日
    00
  • css3实现超过两行文字,超出用三个点显示(兼容性不行,仅供…

    CSS3 实现超过两行文字,超出用三个点显示的完整攻略 在网页设计中,经常会遇到需要限制文本长度的情况,特别是在一些列表、卡片等组件中,需要限制文本长度并用省略号代替。本文将为您提供一份 CSS3 实现超过两行文字,超出用三个点显示的完整攻略,包括使用 text-overflow 属性和 line-clamp 属性两种方法,同时提供两个示例说明。 使用 te…

    other 2023年5月5日
    00
  • Win10正式版升级及官方原版ISO镜像下载工具发布 附下载地址

    Win10正式版升级及官方原版ISO镜像下载工具发布攻略 本攻略将详细介绍如何升级Win10正式版以及官方原版ISO镜像下载工具的使用方法。以下是具体步骤: 升级Win10正式版 首先,确保你的计算机已经安装了Win10预览版。如果你还没有安装,可以从微软官方网站下载并安装。 打开Win10预览版的设置应用程序。你可以通过点击任务栏上的“开始”按钮,然后点击…

    other 2023年8月4日
    00
合作推广
合作推广
分享本页
返回顶部