下面的需求如何实现?

let arr =[
        {
            "userId":20,
            "userName":"444",
            "itemStyle":true,
            "deptId":12
        },
        {
            "userId":22,
            "userName":"NONALPF001adminAL1",
            "itemStyle":true,
            "deptId":12
        },
        {
            "userId":1,
            "userName":"admin",
            "itemStyle":true,
            "deptId":7
        }
    ]


let arr2 = [
    {
        "deptId":7,
        "deptName":"系统管理部",
        "userList":[

        ],
        "isChecked":false,
        "listStyle":true
    },
    {
        "deptId":12,
        "deptName":"分析师",
        "userList":[
            {
                "userId":23,
                "userName":"NONALPF004adminAL1",
                "itemStyle":true,
                "deptId":12
            },
            {
                "userId":24,
                "userName":"NONALPF001adminAL2",
                "itemStyle":true,
                "deptId":12
            }]
    },
    {
        "deptId":13,
        "deptName":"外包人员",
        "userList":[
            {
                "userId":89,
                "userName":"NONALPF010adminAL2",
                "itemStyle":true
            },
            {
                "userId":90,
                "userName":"NONALPF010adminAL3",
                "itemStyle":true
            },
            {
                "userId":193,
                "userName":"NONALPF009adminMem6",
                "itemStyle":true
            }
        ],
        "isChecked":false,
        "listStyle":true
    }
]


如何通过arr的每一项里的deptId,把arr的每一项放在arr2的对应的deptId的那一项的userList中呢?
要求不使用普通的for循环或者forEach。尽量使用一下高级的写法,或者是es6,7,8的写法?
阅读 2.2k
3 个回答

啥叫高级的写法
通常管接收一个函数作为参数的函数叫做高阶函数
你不能因为你天天用foreach就看不起人家
它可是正儿八经的es6提出的高阶函数

 arr2 = arr2.map(item => {
        let json = arr.find(item1 => item.deptId === item1.deptId);
        if (json) {
          item.userList.push(json);
        }
        return item;
      });
      console.log(JSON.stringify(arr2));
let res = arr2.map(item=>{...item,userList:arr1.filter(a=>a.deptId===item.deptId)});

直接替换,arr2中userList会被全部替换
或者

let o={};
let res = arr2.map(item=>{...item,userList:[...item.userList,...arr1.filter(a=>a.deptId===item.deptId)].reduce((b,n)=>{
    o[n.userId]?'':o[n.userId]=true&&b.push(next);
    return b;
},[])});

合并两者的userList,并去根据userId去重

本质上都是嵌套循环,没有多大差别,只是写法不同。有些逻辑该怎么写还是得怎么写,不用过于追求语法糖,最原始的写法也是最安全的写法。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题