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 篱式条件判断
Aug 22 Javascript
网页中的图片的处理方法与代码
Nov 26 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
Feb 23 Javascript
JS原型对象通俗&quot;唱法&quot;
Dec 27 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
Sep 06 Javascript
巧用数组制作图片切换js代码
Nov 29 Javascript
关于微信上网页图片点击全屏放大效果
Dec 19 Javascript
JavaScript中object和Object的区别(详解)
Feb 27 Javascript
HTML的select控件美化
Mar 27 Javascript
JavaScript正则表达式函数总结(常用)
Feb 22 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
Jul 04 Javascript
详解微信小程序自定义组件的实现及数据交互
Jul 22 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 session安全问题分析
2011/06/24 PHP
php实现的返回数据格式化类实例
2014/09/22 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
django解决跨域请求的问题
2018/11/11 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
2015年实习单位评语
2015/03/25 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
飞越疯人院观后感
2015/06/09 职场文书
消防宣传语大全
2015/07/13 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书