JavaScript递归算法生成树形菜单


Posted in Javascript onAugust 15, 2017

本文实例为大家分享了js生成树形菜单的具体代码,供大家参考,具体内容如下

1、最终效果图(这里仅为实现算法,并加载至页面,不做任何css界面优化)

JavaScript递归算法生成树形菜单

注释:本示例包含三级目录菜单,但实际上可支持N级(可使用该代码自行测试)

2、数据源

菜单信息一般来源于数据库中数据表,且为自连接表,其中包含主要字段(主键,菜单名称,父级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——菜单主键id;name——菜单名称;pid——父级id

3、程序设计

菜单信息一般来源

//菜单列表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

4、运行

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

注释:GetData(0, menuArry),0——顶级菜单主键

5、完整代码

<!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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 处理HTML元素必须避免使用的一种方法
Jul 30 Javascript
window.name代替cookie的实现代码
Nov 28 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
Dec 17 Javascript
js判断是否为ie的方法小结
Jan 13 Javascript
使用node.js半年来总结的 10 条经验
Aug 18 Javascript
Bootstrap每天必学之按钮(一)
Nov 24 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
Jan 30 Javascript
浅析$(function) ready和onload 的区别
Sep 03 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
Dec 19 Javascript
使用validate.js实现表单数据提交前的验证方法
Sep 04 Javascript
简单了解node npm cnpm的具体使用方法
Feb 27 Javascript
vue cli安装使用less的教程详解
Jul 12 Javascript
JavaScript中附件预览功能实现详解(推荐)
Aug 15 #Javascript
input输入框内容实时监测(附代码)
Aug 15 #Javascript
vue的基本用法与常见指令
Aug 15 #Javascript
vue如何集成raphael.js中国地图的方法示例
Aug 15 #Javascript
JavaScript与Java正则表达式写法的区别介绍
Aug 15 #Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
Aug 15 #Javascript
form表单序列化详解(推荐)
Aug 15 #Javascript
You might like
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
php的常量和变量实例详解
2017/06/27 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
js 弹出菜单/窗口效果
2011/10/30 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
Swiper实现轮播图效果
2017/07/03 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
Python实现Youku视频批量下载功能
2017/03/14 Python
Python iter()函数用法实例分析
2018/03/17 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
Python 实现向word(docx)中输出
2020/02/13 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
大专计算机个人求职的自我评价
2013/10/21 职场文书
法人授权委托书范本
2014/09/17 职场文书
工作会议通知
2015/04/15 职场文书
确保工程质量承诺书
2015/04/29 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
初三化学教学反思
2016/02/22 职场文书
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL