js (es6) 数组合并、去重、并统计重复数(类似于行转列)

用户所对应的角色单位权限如下图所示,要换成角色单位对应的用户(或数量)

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.csdn.net/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.csdn.net/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

显示结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值