请问如何优雅的将以下的数组重组为二维数组?

想要实现的是的数组效果是,将所有相同的fbill数据合并,最后将合并之后的fRight提取出来组成新的对象插入,组成一个新的二维数据,例如:
旧数据:

oldData: [
           {fModuleID:1,fModule:'系统管理',fbillID:1,fbill:'用户管理',fRightID:1,fRight:'新增'},
           {fModuleID:1,fModule:'系统管理',fbillID:1,fbill:'用户管理',fRightID:2,fRight:'查询'},
           {fModuleID:1,fModule:'系统管理',fbillID:1,fbill:'用户管理',fRightID:3,fRight:'编辑'},
           {fModuleID:1,fModule:'系统管理',fbillID:1,fbill:'用户管理',fRightID:4,fRight:'删除'},
           {fModuleID:1,fModule:'系统管理',fbillID:2,fbill:'部门管理',fRightID:1,fRight:'新增'},
           {fModuleID:1,fModule:'系统管理',fbillID:2,fbill:'部门管理',fRightID:3,fRight:'编辑'},
           {fModuleID:2,fModule:'数据管理',fbillID:1,fbill:'核查教程',fRightID:1,fRight:'新增'},
           {fModuleID:2,fModule:'数据管理',fbillID:2,fbill:'核查项目',fRightID:1,fRight:'新增'},
           {fModuleID:2,fModule:'数据管理',fbillID:2,fbill:'核查项目',fRightID:2,fRight:'查询'},
         ],

变成:

newData:[
          {fModuleID:1,fModule:'系统管理',fbillID:1,fbill:'用户管理',right:[ 
            {fRightID:1,fRight:'新增'},
            {fRightID:2,fRight:'查询'},
            {fRightID:3,fRight:'编辑'},
            {fRightID:3,fRight:'删除'}]},
          {fModuleID:1,fModule:'系统管理',fbillID:1,fbill:'部门管理',right:[
            {fRightID:1,fRight:'新增'},
            {fRightID:3,fRight:'编辑'}]},
          {fModuleID:2,fModule:'数据管理',fbillID:1,fbill:'核查教程',right:[{fRightID:1,fRight:'新增'}]},
          {fModuleID:2,fModule:'数据管理',fbillID:2,fbill:'核查项目',right:[
            {fRightID:1,fRight:'新增'},
            {fRightID:2,fRight:'查询'}]}
        ],

目前我能想到的是三重循环,有没有比较优雅的方法呢?

阅读 2k
3 个回答

逻辑上短了一些,也没三重。

oldData.reduce((acc, cur) => {
  const { fbill, fRightID, fRight } = cur;

  let targetObj = acc.find((obj) => obj.fbill === fbill);
  if (!targetObj) {
    targetObj = { ...cur, right: [] };
    acc.push(targetObj);
  }

  targetObj.right.push({ fRightID, fRight });
  delete targetObj.fRightID;
  delete targetObj.fRight;

  return acc;
}, []);

好像这些问题都挺像的哈,和上一次回答的类似

  oldData.reduce((data, item) => {
    let find = data.find(key => key.fbill === item.fbill)
    if (find) {
      find.right.push({
        fRightId: item.fRightID,
        fRight: item.fRight
      })
    } else {
      data.push({
        fModuleID: item.fModuleID,
        fModule: item.fModule,
        fbillID: item.fbillID,
        fbill: item.fbill,
        right: [
          {
            fRightId: item.fRightID,
            fRight: item.fRight
          }
        ]
      })
    }
    return data
  }, [])
let newData = .reduce((result, data) => {
    !result.some(item => item.fbill === data.fbill) && result.push({
        fModuleID: data.fModuleID,
        fModule: data.fModule,
        fbillID: data.fbillID,
        fbill: data.fbill,
        right:[]
    });
    
    result.map(item => {
        data.fbill === item.fbill && item.right.push({
            fRightID: item.fRightID,
            fRight: item.fRight,
        })
        return item;
    })
    return result
}, [])

看来我动作不够快哎!

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