很久没有发文了,今天发点不一样的,如下:

  <script>// 一维数据:let arrData=[{ r_id: 1, role_name: '开发商', n_id: 1, txt: '主页' },{ r_id: 1, role_name: '开发商', n_id: 2, txt: '项目' },{ r_id: 1, role_name: '开发商', n_id: 3, txt: '报警' },{ r_id: 1, role_name: '开发商', n_id: 4, txt: '客户' },{ r_id: 1, role_name: '开发商', n_id: 5, txt: '设备' },{ r_id: 1, role_name: '开发商', n_id: 6, txt: '设置' },{ r_id: 1, role_name: '开发商', n_id: 7, txt: '集中监控' },{ r_id: 1, role_name: '开发商', n_id: 9, txt: '用户列表' },{ r_id: 1, role_name: '开发商', n_id: 10, txt: '系统设置' },{ r_id: 1, role_name: '开发商', n_id: 11, txt: '报警设置' },{ r_id: 1, role_name: '开发商', n_id: 12, txt: '我的项目' },{ r_id: 1, role_name: '开发商', n_id: 13, txt: '增加项目' },{ r_id: 1, role_name: '开发商', n_id: 14, txt: '权限' },{ r_id: 1, role_name: '开发商', n_id: 15, txt: '角色列表' },{ r_id: 1, role_name: '开发商', n_id: 16, txt: '权限列表' },{ r_id: 1, role_name: '开发商', n_id: 17, txt: '报警日志' },{ r_id: 1, role_name: '开发商', n_id: 18, txt: '报警管理' },{ r_id: 1, role_name: '开发商', n_id: 19, txt: '设备列表' },{ r_id: 2, role_name: '厂商', n_id: 1, txt: '主页' },{ r_id: 2, role_name: '厂商', n_id: 2, txt: '项目' },{ r_id: 3, role_name: '用户', n_id: 2, txt: '项目' },{ r_id: 3, role_name: '用户', n_id: 1, txt: '主页' },{ r_id: 4, role_name: '普通员工', n_id: 3, txt: '报警' },{ r_id: 4, role_name: '普通员工', n_id: 5, txt: '设备' }]// 进行转换:let newArr = [...new Set(arrData.map(item => item.role_name))] // 找出arrData数据中的role_name的多个数据:{role_name:'值'},通过set去重,之后在解构成数组:[]let list = []newArr.forEach(names => {list.push(arrData.filter(item => item.role_name === names))})let mlist = []list.forEach((e,i)=>{let arr = []e.forEach(its=>{arr.push({n_id:its.n_id,txt:its.txt})})mlist.push({r_id:e[0].r_id,role_name:newArr[i],children: arr})})console.log(mlist)//转换后具有父子级关系的数据console.log(mlist)打印的结果如下:[{r_id: 1,role_name: '开发商',children: [{ n_id: 1, txt: '主页' },{ n_id: 2, txt: '项目' },{ n_id: 3, txt: '报警' },{ n_id: 4, txt: '客户' },{ n_id: 5, txt: '设备' },{ n_id: 6, txt: '设置' },{ n_id: 7, txt: '集中监控' },{ n_id: 9, txt: '用户列表' },{ n_id: 10, txt: '系统设置' },{ n_id: 11, txt: '报警设置' },{ n_id: 12, txt: '我的项目' },{ n_id: 13, txt: '增加项目' },{ n_id: 14, txt: '权限' },{ n_id: 15, txt: '角色列表' },{ n_id: 16, txt: '权限列表' },{ n_id: 17, txt: '报警日志' },{ n_id: 18, txt: '报警管理' },{ n_id: 19, txt: '设备列表' }]},{r_id: 2,role_name: '厂商',children: [ { n_id: 1, txt: '主页' }, { n_id: 2, txt: '项目' } ]},{r_id: 3,role_name: '用户',children: [ { n_id: 2, txt: '项目' }, { n_id: 1, txt: '主页' } ]},{r_id: 4,role_name: '普通员工',children: [ { n_id: 3, txt: '报警' }, { n_id: 5, txt: '设备' } ]}]// 对let newArr = [...new Set(arrData.map(item => item.role_name))]的详细解说如下:let obj = arrData.map(item => item.role_name) console.log(obj) //['开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '开发商', '厂商', '厂商', '用户', '用户', '普通员工', '普通员工']let res = new Set(obj)console.log(res) //{'开发商', '厂商', '用户', '普通员工'}let arrs = [...res]console.log(arrs) //['开发商', '厂商', '用户', '普通员工']// 注意:上面只是简单的实现具有层级关系的数据处理,实际工作中常常出现三级层级关系的数据,就权限功能而言,每个主菜单(一级菜单)和负极菜单(二级菜单或更多级菜单)之间应该是嵌套的父子级关系,而并非是上面的同级非嵌套关系,优化后的代码如下:let arrdatas=[{r_id: 1,role_name: '开发商',n_id: 1,txt: '主页',pid: null},{r_id: 1,role_name: '开发商',n_id: 2,txt: '项目',pid: null},{r_id: 1,role_name: '开发商',n_id: 3,txt: '报警',pid: null},{r_id: 1,role_name: '开发商',n_id: 4,txt: '客户',pid: null},{r_id: 1,role_name: '开发商',n_id: 5,txt: '设备',pid: null},{r_id: 1,role_name: '开发商',n_id: 6,txt: '设置',pid: null},{r_id: 1,role_name: '开发商',n_id: 7,txt: '集中监控',pid: 1},{r_id: 1,role_name: '开发商',n_id: 9,txt: '用户列表',pid: 4},{r_id: 1,role_name: '开发商',n_id: 10,txt: '系统设置',pid: 6},{r_id: 1,role_name: '开发商',n_id: 11,txt: '报警设置',pid: 6},{r_id: 1,role_name: '开发商',n_id: 12,txt: '我的项目',pid: 2},{r_id: 1,role_name: '开发商',n_id: 13,txt: '增加项目',pid: 2},{r_id: 1,role_name: '开发商',n_id: 14,txt: '权限',pid: null},{r_id: 1,role_name: '开发商',n_id: 15,txt: '角色列表',pid: 14},{r_id: 1,role_name: '开发商',n_id: 16,txt: '权限列表',pid: 14},{r_id: 1,role_name: '开发商',n_id: 17,txt: '报警日志',pid: 3},{r_id: 1,role_name: '开发商',n_id: 18,txt: '报警管理',pid: 3},{r_id: 1,role_name: '开发商',n_id: 19,txt: '设备列表',pid: 5},{r_id: 2,role_name: '厂商',n_id: 1,txt: '主页',pid: null},{r_id: 2,role_name: '厂商',n_id: 2,txt: '项目',pid: null},{r_id: 3,role_name: '用户',n_id: 2,txt: '项目',pid: null},{r_id: 3,role_name: '用户',n_id: 1,txt: '主页',pid: null},{r_id: 4,role_name: '普通员工',n_id: 3,txt: '报警',pid: null},{r_id: 4,role_name: '普通员工',n_id: 5,txt: '设备',pid: null}]let newarr = [...new Set(arrdatas.map(item => item.role_name))]let lists = []newarr.forEach(names => {lists.push(result.filter(item => item.role_name === names))})let mlists = []list.forEach((e,i)=>{let arr = []e.forEach(its=>{arr.push({n_id:its.n_id,txt:its.txt,pid:its.pid})})// 对没有层级关系的菜单数组进arr行处理的方法:function tree(data,pid,child){let parents = data.filter(p => p[pid] === null),children = data.filter(c => c[pid] !== null);function dataToTree(parents, children){parents.map(p => {children.map((c, i) => {if(c[pid] === p.n_id){let _children = JSON.parse(JSON.stringify(children));_children.splice(i, 1);dataToTree([c], _children);if(p[child]){p[child].push(c);}else{p[child] = [c];};};});});};dataToTree(parents, children);return parents;};let arrTree = tree(arr,'pid','childs');//调用方法最终实现具有嵌套关系的层级菜单数组mlists.push({r_id:e[0].r_id,role_name:newArr[i],childrens: arrTree})})// 最终实现的三级菜单效果如下图:</script>

三级权限菜单数据如下图:

提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者删除。
笔者:苦海

js中将有层级关系的一维数据转换为父子级关系的二维数据、菜单权限三级层级数据实现(树形结构数据)相关推荐

  1. List集合对象处理父子级关系的数据

    需求是查询一张分类表,里面的结构是有一个父级id,然后展示的JSON格式是那种树状的层级关系,类似于: { "父级id":id "父级名称":name &quo ...

  2. 获取树形数据(区域,父子级关系的树形数据)

    获取树形数据(区域,父子级关系的树形数据) public function getAreaTree($code) { $where = ''; if ($code){ $where = ['b.cod ...

  3. numpy使用[]语法索引二维numpy数组中指定范围数据行的数值内容(accessing rows in numpy array with specific range)

    numpy使用[]语法索引二维numpy数组中指定范围数据行的数值内容(accessing rows in numpy array with specific range) 目录

  4. php将从数据库取出的数据分为6个一组的二维数组

    $presell = M('presell')->field('id,sname,num,weight,shop_price,endtime,supply,givetime')->wher ...

  5. 微信小程序扫一扫和微信自带的扫一扫 获取二维码的url包括参数数据

    微信扫一扫二维码跳转指定的页面,而指定的页面获取二维码的url包括参数 在指定的页面.js 我们先以index来为列子吧 index.js onLoad: function(options) {con ...

  6. java父子表_数据库二维表转父子关系,java,stream,list

    需求描述:把数据库中的省市二维表,查询到内存中后,转换为父子层级关系.通过jdk8中的stream方式实现. 数据关系: 320004    福建省    320507    南平市 430000   ...

  7. 数据建模步骤文档_二维溃坝洪水模拟(五)二维模型建模

    1 前言 本文主要说明案例中水库下游区域HEC-RAS二维建模的过程.文章首先给出建模的基本原则与建模的注意事项,确定了大致的研究区域.其次,整个下游洪水演进区域由单一二维模型模拟,下游存在一条较大的 ...

  8. 向函数传递一维数组和已知大小的二维数组

    一维数组 在C语言中,向函数传递参数只有一种形式--值传递.不管是传递一个整型变量,还是传递一个指针,函数得到的都只是实参的拷贝值. 先定义一个一维整型数组: int a[] = { 0, 1, 2, ...

  9. c++如何打印一维数组首地址_C语言之二维数组和指针的结合

    最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习.自己纠结的问题是二维数组 int a[3][4]的数组名是 ...

最新文章

  1. cifs mount 挂载共享目录_安装cifsutils解决linux挂载windows共享文件夹
  2. python百度翻译接口_python3 调用百度翻译API翻译英文
  3. opencv-Getting Started with Videos
  4. word怎么改一张纸的方向_折纸手工DIY,纸碗怎么折?一张纸就搞定,折法简单,宝宝也能折...
  5. 在Windows中测试c语言单个函数运行时间方法
  6. Android 5.0 双卡信息管理分析
  7. 武魂觉醒s系列服务器,斗罗大陆武魂觉醒斗罗大陆9服开服时间表_斗罗大陆武魂觉醒新区开服预告_第一手游网手游开服表...
  8. 网页自动关机代码HTML,电脑怎么设置自动关机时间
  9. 如何创建一个基本的魔兽全图外挂 HowTo create a basic Maphack by Chaotic
  10. MT【99】2005联赛二试题我的一行解法
  11. Rclone挂载SharePoint
  12. New Concept English3 Lesson 2. Thirteen equals one【精讲学习笔记】
  13. java微信公众号支付开发平台_微信公众号支付demo,微信公众号支付Java DEMO
  14. 数学建模python实现基础编程练习4
  15. 超图平台倾斜摄影发布流程
  16. 宁夏开票系统服务器地址,宁夏增值税发票综合服务平台网址
  17. 板材品牌排名之橱柜用生态板
  18. C语言:二维数组:求平均数
  19. 2.3.1操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则
  20. Http中post/get请求参数接收

热门文章

  1. MySQL 分组查询
  2. IDEA里的web.xml页面的Servlet名称报错下方出现红色下划线
  3. nosql简答什么是最终一致性_可靠消息最终一致性方案中预发送作用是什么
  4. python自增_Python的自增运算与Python变量的浅析
  5. python基础(13)之数组
  6. python与数据处理_python数据处理:数据合并和Reshaping
  7. 10分钟带你了解python_ComeOn!10分钟带你了解Python的变量和数据类型
  8. 【工作总结】银行的等级架构
  9. CentOS 6.5 下安装 Kibana5
  10. React- jsx的使用可以渲染html标签 或React组件