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

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

  <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 result=[{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(result.map(item => item.role_name))]let list = []newArr.forEach(names => {list.push(result.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,pid:its.pid})})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');mlist.push({r_id:e[0].r_id,role_name:newArr[i],childrens: arrTree})})console.log(mlist)// 最终实现的三级菜单效果如下图:</script>

三级权限菜单数据如下图:
在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改器内置脚本编写_Node.js 中实践 Redis Lua 脚本

对别人的意见要表示尊重。千万别说&#xff1a;"你错了。"——卡耐基Lua 是一种轻量小巧的脚本语言&#xff0c;用标准 C 语言编写并以源代码形式开放&#xff0c;其设计目的是为了嵌入应用程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。由于 Lua 语言…

项目上线,部署到服务器(腾讯服务器),http协议及https协议(微信小程序必须https协议才可发布)

一、准备服务器&#xff1a; 1.选择自己的服务器&#xff0c;这里有很多服务器比如&#xff0c;阿里服务器&#xff0c;腾讯服务器等&#xff0c;这里我选择腾讯服务器做测试&#xff0c;其官网&#xff1a;https://cloud.tencent.com/&#xff0c;微信扫码登录后如下进入首页…

队列的基本操作_算法与数据结构(五) 栈和队列

? 工欲善其事&#xff0c;必先利其器。栈和队列 - Stack And Queue栈如何理解栈呢&#xff1f;后进者先出&#xff0c;先进者后出&#xff0c;这就是典型的 "栈" 结构。04_栈和队列-栈结构从栈的操作特性上来看&#xff0c;栈是一种“操作受限”的线性表&#xff0c…

八邻域轮廓跟踪算法_结合mRMR选择和IFCM聚类的遥感影像分类算法

随着遥感成像技术的发展&#xff0c;高分遥感影像空间分辨率逐年提高&#xff0c;已经成为获取地物信息的主要数据来源之一。高分影像分类作为遥感影像处理的重要任务之一&#xff0c;在地理国情普查与监测、数字城市建设、城市规划等领域具有广阔的应用前景。高分影像具有纹理…

node.js中net模块、node实现tcp通信

node.js中net 一、net模块感知&#xff1a; net模块用于创建基于TCP&#xff08;或IPC&#xff09;通信的服务器或客户端&#xff0c;它是nodejs内置模块&#xff0c;直接使用require(‘net’)的方式引入&#xff0c;类似http模块。 二、创建一个tcp服务器&#xff1a; //1…

struts2--文件上传大小

struts2--文件上传大小 Struts2文件上传的大小限制问题 问题&#xff1a;上传大文件报错……解决&#xff1a;修改struts.xml文件中的参数如下<constant name"struts.multipart.maxSize" value"55000000"/><action name"UploadFile" cl…

element-plus中导航高亮不自动刷新问题

解决使用element-plus el-submenu时页面被this.$router.push(“xxx”)跳转后&#xff0c;导航菜单高亮不能自动刷新问题&#xff0c;需要注意以下几点&#xff1a; 在el-menu加上routerindex必须绑定路由的path,参考上面的例子&#xff0c;/不能少default-active设为当前路由&…

计算机二级考试python怎么报名_计算机二级报名流程和条件

对于第一次参加全国计算机二级考试的考生来说&#xff0c;他们对于计算机二级报名流程和条件不是清楚&#xff0c;小编这就来给大家梳理一下。计算机二级报名流程 一、报名 分为网上报名和现场报名。 网上报名&#xff1a;考生在规定时间内登录本省计算机资格网站&#xff0c;按…

操作对象_DOM进阶——HTML属性操作(对象属性)

上一节我们在“DOM基础”学习了对元素节点的操作&#xff0c;这两节介绍对属性节点的操作。属性节点操作有两种方式&#xff0c;一种是使用“对象属性”&#xff0c;另一种是“对象方法”。本节主要介绍“对象属性”的方式。对属性节点的操作涉及两种操作&#xff0c;分别是获取…

三级菜单数据实现,实现嵌套三级菜单数据

//将数据库中通过关联&#xff08;inner join&#xff09;查询多张表没有嵌套但有嵌套关系的数据进行处理&#xff0c;得到具有嵌套层级且嵌套的父级二级属性不可重复出现&#xff0c;具体实现如下&#xff1a;// 通过关联查询到数据库的数据&#xff08;格式&#xff09;&…

sap相关性不能被编译_经典综述编译丨生物硝化抑制丨NAT PLANTS:现代农业中的氮转化和生物硝化抑制作用...

点击蓝字↑↑↑“农作未来(FarmingFuture)”&#xff0c;轻松关注&#xff0c;农作制度研究与您同行&#xff01;编译&#xff1a;贾蓉 排版&#xff1a;王上原创微文&#xff0c;欢迎转发转载。文章信息原名&#xff1a;Nitrogen transformations in modern agriculture and …

Hadoop学习笔记(一)从官网下载安装包

Hadoop是一个分布式系统基础架构&#xff0c;由Apache基金会所开发。用户能够在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威力进行快速运算和存储。要学习Hadoop从下载安装包開始打开Hadoop的官方站点&#xff0c;点击Download Hadoop或点击“G…

版本之间如何兼容_Spring Boot 2.4 版本的系统运行要求

名字Servlet 版本Tomcat 9.04.0Jetty 9.43.1Undertow 2.04.0Spring Boot 2.4.2-SNAPSHOT 版本要求至少 Java 8 及其以上版本&#xff0c;目前最高能够支持到 Java 15 &#xff08;包含 15&#xff09;的版本。 Spring 框架&#xff08;Framework&#xff09; 5.3.2 的版本或者以…

JavaScript异步处理问题,循环处理异步任务,并拿到数据,Nodejs循环异步任务接口处理

一、问题描述及解答&#xff1a; 在Promise(异步事件)中&#xff0c;通过遍历的方式处理数据&#xff0c;最后将带有数据的Promise通过return返回&#xff0c;在async/await处理机制中的到的数据是一个空数据组[]或不完整的数据&#xff0c;如下&#xff1a; 使用定时器后数据…

tomcat lifecyclelistener_大公司程序员带你死磕Tomcat系列(五)——容器

死磕Tomcat系列(5)——容器回顾在死磕Tomcat系列(1)——整体架构中我们简单介绍了容器的概念&#xff0c;并且说了在容器中所有子容器的父接口是Container。在死磕Tomcat系列(2)——EndPoint源码解析中&#xff0c;我们知道了连接器将请求过来的数据解析成Tomcat需要的ServletR…

获取当前周一日期_Excel工作表中最全的时间和日期函数,效率、办公必备

在Excel工作表中&#xff0c;函数也可以分为好几类&#xff0c;今天&#xff0c;小编带大家学习时间和日期函数。一、Excel工作表日期函数&#xff1a;Date。功能&#xff1a;返回特定日期的序列号。语法结构&#xff1a;Date(年,月,日)。目的&#xff1a;将制定的“年”、“月…

这样就算会了PHP么?-11

PHP中关于类的基本内容练习&#xff1a; <?phpclass SportObject{public $name;public $height;public $avirdupois;public function __construct($name, $height,$avirdupois) {$this->name $name;$this->height $height;$this->avirdupois $avirdupois;}func…

一个黑色全屏的计时器_我入手了一个1000多的智能手环,值吗?|Fitbit Charge 4测评...

入手Fitbit Charge 4了。作为一个喜欢晚上做运动的Boy&#xff0c;每次运动带着手机确实有够累赘&#xff0c;比如跑步的时候&#xff0c;掏手机看真的很麻烦&#xff0c;但手环只需抬手即可看时间、心率、步数这些&#xff0c;确实很方便。而且&#xff0c;有了手环之后&#…

python没有用_你可能没有在Python3中使用但却应该使用的东西

Python部落(python.freelycode.com)组织翻译&#xff0c;禁止转载&#xff0c;欢迎转发。 由于Python EOL的发布&#xff0c;许多人开始将他们的Python版本从2切换到3。不幸的是&#xff0c;我发现大多数Python3看起来仍然像Python2&#xff0c;但是要加括号(尽管在我之前的文章…

boost库 bind/function的使用

Boost::Function 是对函数指针的对象化封装&#xff0c;在概念上与广义上的回调函数类似。相对于函数指针&#xff0c;function除了使用自由函数&#xff0c;还可以使用函数对象&#xff0c;甚至是类的成员函数&#xff0c;这个就很强大了哈 #include <boost/function.hpp&g…