JavaScript递归算法实现多级树形菜单生成

作者:代码拾荒

时间:2026-10-22

浏览:394

本文介绍如何使用JavaScript递归算法在前端生成多级树形菜单。通过模拟数据库自连接表数据,利用递归函数遍历节点,将扁平数组转换为嵌套的HTML列表结构。示例包含完整代码及运行逻辑,支持N级目录扩展,适用于需要动态展示层级关系的前端场景。

文章目录

JavaScript递归生成树形菜单概述

本文分享了一段使用JavaScript生成树形菜单的具体代码实现,供读者参考学习。

首先展示最终生成的菜单效果。本示例仅关注算法逻辑与页面加载,未进行CSS样式美化。

JavaScript递归生成树形菜单概述

注:该示例演示了三级目录结构,但代码逻辑支持任意深度的N级菜单,用户可自行测试验证。

数据源结构与程序设计

接下来分析数据源结构。

通常菜单数据来自数据库中的自连接表,主要包含主键、菜单名称和父级ID三个核心字段。

本示例在前端直接使用对象数组来模拟从数据库获取的菜单数据。


var menuArry = [
{ id: 1, name: "办公管理", pid: 0 },
{ id: 2, name: "请假申请", pid: 1 },
{ id: 3, name: "出差申请", pid: 1 },
{ id: 4, name: "请假记录", pid: 2 },
{ id: 5, name: "系统设置", pid: 0 },
{ id: 6, name: "权限管理", pid: 5 },
{ id: 7, name: "用户角色", pid: 6 },
{ id: 8, name: "菜单设置", pid: 6 },
]; 

注:其中id代表菜单主键,name为菜单名称,pid表示父级ID。

随后进入程序设计环节。

菜单数据通常来源于后端数据库,此处为演示方便,前端直接构造数据。


//菜单列表html
    var menus = '';
 
    //根据菜单主键id生成菜单列表html
    //id:菜单主键id
    //arry:菜单数组信息
    function GetData(id, arry) {
      var childArry = GetParentArry(id, arry);
      if (childArry.length > 0) {
        menus += '<ul>';
        for (var i in childArry) {
          menus += '<li>' + childArry[i].name;
          GetData(childArry[i].id, arry);
          menus += '</li>';
        }
        menus += '</ul>';
      }
    }
 
    //根据菜单主键id获取下级菜单
    //id:菜单主键id
    //arry:菜单数组信息
    function GetParentArry(id, arry) {
      var newArry = new Array();
      for (var i in arry) {
        if (arry[i].pid == id)
          newArry.push(arry[i]);
      }
      return newArry;
    }

注:本示例使用ul无序列表来渲染菜单,menus变量用于存储最终生成的HTML字符串。

代码运行与完整实现

接着介绍运行方式。


GetData(0, menuArry)
$("body").append(menus);

注:调用GetData(0, menuArry),其中参数0代表顶级菜单的主键ID。

最后提供完整代码供参考。


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title></title>
  <script src="jquery-1.8.3.min.js"></script>
</head>
<body>
 
  <script type="text/javascript">
    $(function () {
      var menuArry = [
      { id: 1, name: "办公管理", pid: 0 },
      { id: 2, name: "请假申请", pid: 1 },
      { id: 3, name: "出差申请", pid: 1 },
      { id: 4, name: "请假记录", pid: 2 },
      { id: 5, name: "系统设置", pid: 0 },
      { id: 6, name: "权限管理", pid: 5 },
      { id: 7, name: "用户角色", pid: 6 },
      { id: 8, name: "菜单设置", pid: 6 },
      ];
 
      GetData(0, menuArry)
      $("body").append(menus);
    });
 
    //菜单列表html
    var menus = '';
 
    //根据菜单主键id生成菜单列表html
    //id:菜单主键id
    //arry:菜单数组信息
    function GetData(id, arry) {
      var childArry = GetParentArry(id, arry);
      if (childArry.length > 0) {
        menus += '<ul>';
        for (var i in childArry) {
          menus += '<li>' + childArry[i].name;
          GetData(childArry[i].id, arry);
          menus += '</li>';
        }
        menus += '</ul>';
      }
    }
 
    //根据菜单主键id获取下级菜单
    //id:菜单主键id
    //arry:菜单数组信息
    function GetParentArry(id, arry) {
      var newArry = new Array();
      for (var i in arry) {
        if (arry[i].pid == id)
          newArry.push(arry[i]);
      }
      return newArry;
    }
  </script>
</body>
</html>

以上为本文全部内容,希望能为读者提供学习帮助,欢迎继续支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章