用户所对应的角色单位权限如下图所示,要换成角色单位对应的用户(或数量)
1.原始Json数据
//原始数组
var list=[
{
"RightDept": [{"role":"实验室管理员","bm":"化学与生命科学学院"},{"role":"aaa","bm":"化学与生命科学学院"},{"role":"aaa","bm":"艺术学院"}],
"DeptName": "建筑与材料工程学院",
"UserNo": 4944,
"UserId": "00000013",
"UserName": "邢宽广"
},
{
"RightDept": [{"role":"管理员","bm":"所有部门"},{"role":"实验室管理员","bm":"化学与生命科学学院"},{"role":"实验室管理员","bm":"艺术学院"},{"role":"aaa","bm":"化学与生命科学学院"},{"role":"11c","bm":"艺术学院"},{"role":"22","bm":"建筑与材料工程学院"}],
"DeptName": "外国语学院",
"UserNo": 4031,
"UserId": "00000014",
"UserName": "覃姗姗"
},
{
"RightDept": [{"role":"管理员","bm":"所有部门"},{"role":"实验室管理员","bm":"艺术学院"}],
"DeptName": "文学院",
"UserNo": 3972,
"UserId": "00000017",
"UserName": "吴馨"
}
]
2.数组(用户所属角色)合并
//数组合并
var arr=[]
list.forEach(node =>{
arr=arr.concat(node["RightDept"])
})
//合并参考:https://blog.youkuaiyun.com/weixin_44594219/article/details/116890268
用户所属角色去重后显示的结果:
3.数组(用户所属角色)去重
/*
//直接去重(只能是单个数组)
[...new Set(arr)]
[...new Set(arr.map(i => i.role+'.'+i.bm))]
//(7) ['实验室管理员.化学与生命科学学院', 'aaa.化学与生命科学学院', 'aaa.艺术学院', '管理员.所有部门', '实验室管理员.艺术学院', '11c.艺术学院', '22.建筑与材料工程学院']
参考:https://www.cnblogs.com/Acyang/p/15650964.html
*/
//去重函数
var clearDuplicate = (arr, key1,key2) => arr.reduce((acc, current) => {
const x = acc.find(item => item[key1] === current[key1] &&item[key2] === current[key2]);
if (!x) {
{
return acc.concat([current]);
}
} else {
return acc;
}
}, []);
var newArr=clearDuplicate(arr,"role","bm")
//去重参考:https://blog.youkuaiyun.com/weixin_42350606/article/details/112625497?utm_source=app&app_version=5.3.1&code=app_1562916241&uLinkId=usr1mkqgl919blen
用户所属角色去重后显示的结果:
4.统计角色具有的用户数量
//统计重复数据
newArr.forEach(n => {
n.num=arr.filter(t => t.role === n.role&&t.bm===n.bm).length
})
//统计参考:https://www.cnblogs.com/Acyang/p/15650964.html
上面实现了角色用户的个数,如果想显示角色具体对应那些用户,则就要进一步的实现代码了
5.完善后的全部代码
var list=[
{
"RightDept": [{"role":"实验室管理员","bm":"化学与生命科学学院"},{"role":"aaa","bm":"化学与生命科学学院"},{"role":"aaa","bm":"艺术学院"}],
"DeptName": "建筑与材料工程学院",
"UserNo": 4944,
"UserId": "00000013",
"UserName": "邢宽广"
},
{
"RightDept": [{"role":"管理员","bm":"所有部门"},{"role":"实验室管理员","bm":"化学与生命科学学院"},{"role":"实验室管理员","bm":"艺术学院"},{"role":"aaa","bm":"化学与生命科学学院"},{"role":"11c","bm":"艺术学院"},{"role":"22","bm":"建筑与材料工程学院"}],
"DeptName": "外国语学院",
"UserNo": 4031,
"UserId": "00000014",
"UserName": "覃姗姗"
},
{
"RightDept": [{"role":"管理员","bm":"所有部门"},{"role":"实验室管理员","bm":"艺术学院"}],
"DeptName": "文学院",
"UserNo": 3972,
"UserId": "00000017",
"UserName": "吴馨"
}
]
//数组合并
var arr=[]
list.forEach(node =>{
let m=node["RightDept"]
//把角色所对应的用户信息也复制过来
m.forEach(n =>{
n.no=node.UserNo
n.id=node.UserId
n.xm=node.UserName
})
arr=arr.concat(m)
})
/*
//直接去重(只能是数组,对象好像不行)
[...new Set(arr)]
[...new Set(arr.map(i => i.role+'.'+i.bm))]
//(7) ['实验室管理员.化学与生命科学学院', 'aaa.化学与生命科学学院', 'aaa.艺术学院', '管理员.所有部门', '实验室管理员.艺术学院', '11c.艺术学院', '22.建筑与材料工程学院']
*/
//去重函数
var clearDuplicate = (arr, key1,key2) => arr.reduce((acc, current) => {
const x = acc.find(item => item[key1] === current[key1] &&item[key2] === current[key2]);
if (!x) {
{
return acc.concat([current]);
}
} else {
return acc;
}
}, []);
var newArr=clearDuplicate(arr,"role","bm")
newArr.forEach(n => {
//n.num=arr.filter(t => t.role === n.role&&t.bm===n.bm).length
let m=arr.filter(t => t.role === n.role&&t.bm===n.bm)
n.user=m.map(i=>{
//键转数组
let c={id:i.id,xm:i.xm,no:i.no}
//删除不需要的键
delete i.id
delete i.xm
delete i.no
return c
})
})
newArr
显示结果: