Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
356 views
in Technique[技术] by (71.8m points)

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

想要实现的是的数组效果是,将所有相同的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:'查询'}]}
        ],

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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;
}, []);

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...