老莫的笔记本  
  
查看: 1089|回复: 1

关于多级菜单的处理

[复制链接]

664

主题

880

帖子

5155

积分

超级版主

Rank: 8Rank: 8

积分
5155
发表于 2018-10-14 23:46:48 | 显示全部楼层 |阅读模式
先掰扯一下  
什么是多级菜单: 就是 主菜单-》子菜单-》孙子菜单-》曾孙子菜单 依次不断往后延伸 ;
但是:所有数据表的数据结构 却都是一样的
  1. var menusarr = [
  2.         {'id':'1','gid':'0','title':'客户管理','statue':'0','url':'/abc/a'}
  3.         ,{'id':'2','gid':'1','title':'客户列表','statue':'0','url':'/abc/a'}
  4.         ,{'id':'3','gid':'1','title':'客户状态','statue':'0','url':'/abc/a'}
  5.         ,{'id':'4','gid':'3','title':'睡着的','statue':'0','url':'/abc/a'}
  6.         ,{'id':'5','gid':'3','title':'发财的','statue':'0','url':'/abc/a'}
  7.         ,{'id':'6','gid':'4','title':'眯着眼睡的','statue':'0','url':'/abc/a'}
  8.         ,{'id':'7','gid':'0','title':'员工管理','statue':'0','url':'/abc/a'}
  9.         ,{'id':'8','gid':'0','title':'等级管理','statue':'0','url':'/abc/a'}
  10.         ,{'id':'9','gid':'0','title':'客户管理','statue':'0','url':'/abc/a'}
  11.         ,{'id':'10','gid':'7','title':'准备滚蛋的','statue':'0','url':'/abc/a'}
  12.         ,{'id':'11','gid':'10','title':'带着铺盖卷滚蛋的','statue':'0','url':'/abc/a'}
  13.         ,{'id':'12','gid':'0','title':'系统设置','statue':'0','url':'/abc/a'}
  14.     ]
复制代码
如上, 如果有父级菜单 那么 gid = 父级的id  ; 如果没有  就是顶级菜单。

先贴一段 我原本写的 nodeJS 菜单生成方法 注意 在这一段中,菜单有一个等级的字段 不向上面这段数据 这么任性 ;
  1. // 获取列表
  2. router.get('/', async (ctx, next) => {
  3.   console.log('进来了menu 目标获取目录列表');
  4.   //设置基础值 data就是 列表项 传输出去的值 也是这个
  5.   // 获取所有菜单的值 数据表
  6.   let dk =  await DB.find('menuS',{}) ;
  7. //   排序
  8.   dk.sort(compareAsc("paixu"));
  9.   // 在这个位置生成菜单JSON
  10.   let menuArry = []
  11.         
  12.   // 循环生成一级表单
  13.   for(var k=0; k<dk.length; k++){
  14.       // 判断
  15.       if(dk[k].dengji == 1){
  16.           // 如果没有父级 创建一级菜单
  17.           menuArry.push(dk[k])
  18.       }
  19.   }
  20.   // 先把2存出来,再把3添加到2中,最后把2 添加到1 中
  21.   var dj2Arry = []
  22.         
  23.   // 循环生成二级表单
  24.   for(var m=0; m<dk.length; m++){
  25.       // 如果是二级菜单
  26.       if(dk[m].dengji ==2 ){
  27.           // 存出二级菜单,然后循环该数组将三级菜单存入
  28.           dj2Arry.push(dk[m])
  29.       }
  30.   }
  31.   // 循环生成三级表单 并存入 二级菜单中
  32.   for(var j=0; j<dk.length; j++){
  33.       // 如果是三级菜单
  34.       if(dk[j].dengji ==3){
  35.             // 向父级数组List中添加
  36.           for(var mm=0; mm<dj2Arry.length; mm++){
  37.               // 判断,如果寻找id值相等的父级
  38.               if(dj2Arry[mm]._id == dk[j].parent){
  39.                   // 填充相应的三级列表到 二级数组中
  40.                   dj2Arry[mm].list.push({"name": dk[j].jump,"title":dk[j].title})
  41.               }
  42.           }
  43.       }
  44.   }
  45.   //最后一步 把2存到1中
  46.   for(var m=0; m<dj2Arry.length; m++){
  47.       // 向父级数组List中添加
  48.       for(var mm=0; mm<menuArry.length; mm++){
  49.           // 判断,如果寻找id值相等的父级
  50.           if(menuArry[mm]._id == dj2Arry[m].parent && dj2Arry[m].list.length>0){
  51.               menuArry[mm].list.push({"name" : dj2Arry[m].jump , "title" : dj2Arry[m].title ,"list" : dj2Arry[m].list})
  52.           }
  53.           if(menuArry[mm]._id == dj2Arry[m].parent && dj2Arry[m].list.length == 0){
  54.             menuArry[mm].list.push({"name" : dj2Arry[m].name , "title" : dj2Arry[m].title ,"jump" : dj2Arry[m].jump})
  55.         }
  56.       }
  57.    
  58.   }
  59.   let  menuL = { "code": "0" ,"msg": "这是msg的值" ,"data": menuArry} ;
  60.   ctx.body = menuL
  61. })
复制代码

然后  我要开始处理一开始的这段数据拉,因为这段数据是无限极下拉菜单 【待完善】





回复

使用道具 举报

664

主题

880

帖子

5155

积分

超级版主

Rank: 8Rank: 8

积分
5155
 楼主| 发表于 2018-10-14 23:50:14 | 显示全部楼层
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="utf-8">
  5.     <title>aaa</title>
  6. </head>
  7. <body>
  8.     <h1>测试一个方法</h1>
  9.     <script>
  10.     //多级菜单的原理
  11.     var a= 15 ;
  12.     function mm( num ){
  13.         var arr=[];
  14.         ab(num)
  15.         function ab(num){
  16.             num = num-1;
  17.             if(arr.length<4){
  18.                 arr.push(num)
  19.                 ab(num)
  20.             }else{
  21.                 console.log(arr)
  22.             }
  23.         }
  24.     }
  25.     mm(a); //该方法不是异步
  26.     console.log('aaaa')
  27.     </script>
  28.     <script>
  29.     // 写一个多级嵌套菜单 处理方法 处理结果为一个嵌套的JSON数据  可无限极延伸
  30.     // 已知数据格式
  31.     var menusarr = [
  32.         {'id':'1','gid':'0','title':'客户管理','statue':'0','url':'/abc/a'}
  33.         ,{'id':'2','gid':'1','title':'客户列表','statue':'0','url':'/abc/a'}
  34.         ,{'id':'3','gid':'1','title':'客户状态','statue':'0','url':'/abc/a'}
  35.         ,{'id':'4','gid':'3','title':'睡着的','statue':'0','url':'/abc/a'}
  36.         ,{'id':'5','gid':'3','title':'发财的','statue':'0','url':'/abc/a'}
  37.         ,{'id':'6','gid':'4','title':'眯着眼睡的','statue':'0','url':'/abc/a'}
  38.         ,{'id':'7','gid':'0','title':'员工管理','statue':'0','url':'/abc/a'}
  39.         ,{'id':'8','gid':'0','title':'等级管理','statue':'0','url':'/abc/a'}
  40.         ,{'id':'9','gid':'0','title':'客户管理','statue':'0','url':'/abc/a'}
  41.         ,{'id':'10','gid':'7','title':'准备滚蛋的','statue':'0','url':'/abc/a'}
  42.         ,{'id':'11','gid':'10','title':'带着铺盖卷滚蛋的','statue':'0','url':'/abc/a'}
  43.         ,{'id':'12','gid':'0','title':'系统设置','statue':'0','url':'/abc/a'}
  44.     ]
  45.     var menusdata=[] //最后生成 的菜单数组
  46.     function menusjson(menusarr)
  47.     {
  48.         var arr=[];
  49.         dojson(menusarr)
  50.          // 先开始循环 提出一级菜单
  51.         for(var i=0; i<menusarr.length; i++){
  52.             if(!menusarr[i].gid){
  53.                 menusdata.push(menusarr[i])
  54.             }else{
  55.                 arr.push(menusarr[i])
  56.             }
  57.         }
  58.         // 用来处理循环的数组,不断的判断 Arr的长度。看是否有值没有找到父级 直到所有值都找到了父级
  59.         function dojson(menusdata,arr){
  60.             if(arr.length>0){
  61.                 // 循环
  62.                 for(var k=0; k<arr.length; k++)
  63.                 {
  64.                     for(var j=0;j<menusdata.length; j++){
  65.                         if(arr[k].gid == menusdata[j].id){
  66.                             // 判断是否有list属性 没有就给他加list属性 对应的值是 arr
  67.                             if(menusdata[j].list){
  68.                                 menusdata[j].list = [arr[k]];   //增加list 属性
  69.                             }else{
  70.                                  menusdata[j].list.push(arr[k])  //如果有 就往里添加
  71.                             }
  72.                         }
  73.                     }
  74.                 }
  75.             }else{
  76.                 // 输出结果
  77.                
  78.             }
  79.         }
  80.     }
  81.     </script>
  82. </body>
  83. </html>
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表