JS中如何对数据进行分组?

How to group the data in JS?

在我的简单 JS 应用程序中,我需要按顺序显示数据。

流量:

用户首先选择扇区,所以我们有基于用户选择的扇区数据,

const selectedSectors = [{sectorName: "Sector One", sectorId: 5}, {sectorName: "Sector Two", sectorId: 24}]

那么我们已经有了部门和职位的数据,我们正在通过代码获取匹配的记录,

const selectedSectors = [{sectorName: "Sector One", sectorId: 5}, {sectorName: "Sector Two", sectorId: 24}]

const departments = [{"DepartmentID":51,"SectorID":5,"Name":"Production","SortOrder":1},{"DepartmentID":52,"SectorID":5,"Name":"Design/Engineering","SortOrder":2},{"DepartmentID":92,"SectorID":24,"Name":"Consulting","SortOrder":8},{"DepartmentID":114,"SectorID":24,"Name":"Administration","SortOrder":5}]

const jobTitles = [{"JobTitleID":167,"DepartmentID":51,"JobName":"Production Manager","Deleted":false,"SortOrder":5},{"JobTitleID":294,"DepartmentID":52,"JobName":"Senior Truss Designer","Deleted":false,"SortOrder":5},{"JobTitleID":178,"DepartmentID":51,"JobName":"Production Supervisor","Deleted":false,"SortOrder":3},{"JobTitleID":191,"DepartmentID":92,"JobName":"Saw Shop Supervisor","Deleted":false,"SortOrder":1},{"JobTitleID":461,"DepartmentID":114,"JobName":"Sawyer","Deleted":false,"SortOrder":7},{"JobTitleID":461,"DepartmentID":66,"JobName":"Sawyer","Deleted":false,"SortOrder":7},{"JobTitleID":474,"DepartmentID":92,"JobName":"Senior Truss Designer - Part Time","Deleted":false,"SortOrder":11},{"JobTitleID":449,"DepartmentID":51,"JobName":"Senior Wall Panel Designer","Deleted":false,"SortOrder":15},{"JobTitleID":278,"DepartmentID":114,"JobName":"Service Manager","Deleted":false,"SortOrder":2}]
    
    
const filteredData = departments.flatMap(department => {
const jobtitles= jobTitles.filter(
   (jobTitle) => jobTitle.DepartmentID === department.DepartmentID
);
  const newObj = {
      deptName: department.Name,
      jobtitles,
  };
 return newObj;
})

console.log('filteredData ', filteredData)

上面的代码产生如下结果,

当前输出:

  [
   {
      "deptName":"Production",
      "jobtitles":[
         {
            "JobTitleID":167,
            "DepartmentID":51,
            "JobName":"Production Manager",
            "Deleted":false,
            "SortOrder":5
         },
         {
            "JobTitleID":178,
            "DepartmentID":51,
            "JobName":"Production Supervisor",
            "Deleted":false,
            "SortOrder":3
         },
         {
            "JobTitleID":449,
            "DepartmentID":51,
            "JobName":"Senior Wall Panel Designer",
            "Deleted":false,
            "SortOrder":15
         }
      ]
   },
   {
      "deptName":"Design/Engineering",
      "jobtitles":[
         {
            "JobTitleID":294,
            "DepartmentID":52,
            "JobName":"Senior Truss Designer",
            "Deleted":false,
            "SortOrder":5
         }
      ]
   },
   {
      "deptName":"Consulting",
      "jobtitles":[
         {
            "JobTitleID":191,
            "DepartmentID":92,
            "JobName":"Saw Shop Supervisor",
            "Deleted":false,
            "SortOrder":1
         },
         {
            "JobTitleID":474,
            "DepartmentID":92,
            "JobName":"Senior Truss Designer - Part Time",
            "Deleted":false,
            "SortOrder":11
         }
      ]
   },
   {
      "deptName":"Administration",
      "jobtitles":[
         {
            "JobTitleID":461,
            "DepartmentID":114,
            "JobName":"Sawyer",
            "Deleted":false,
            "SortOrder":7
         },
         {
            "JobTitleID":278,
            "DepartmentID":114,
            "JobName":"Service Manager",
            "Deleted":false,
            "SortOrder":2
         }
      ]
   }
]

以上是基于编写的代码所期望的。并过滤departmentsjobtitles中匹配DepartmentID的数据。但是我错过了显示数据以及 Sectors..

所以用户选择 Sector 基于 department 和部门的 jobtitles 必须显示。

所以我希望水平完全一样,

预期输出:

[
   {
      "sectorid":5,
      "SectorName":"Sector One",
      "departments":[
         {
            "deptName":"Production",
            "jobtitles":[
               {
                  "JobTitleID":167,
                  "DepartmentID":51,
                  "JobName":"Production Manager",
                  "Deleted":false,
                  "SortOrder":5
               },
               {
                  "JobTitleID":178,
                  "DepartmentID":51,
                  "JobName":"Production Supervisor",
                  "Deleted":false,
                  "SortOrder":3
               },
               {
                  "JobTitleID":449,
                  "DepartmentID":51,
                  "JobName":"Senior Wall Panel Designer",
                  "Deleted":false,
                  "SortOrder":15
               }
            ]
         },
         {
            "deptName":"Design/Engineering",
            "jobtitles":[
               {
                  "JobTitleID":294,
                  "DepartmentID":52,
                  "JobName":"Senior Truss Designer",
                  "Deleted":false,
                  "SortOrder":5
               }
            ]
         }
      ]
   },
   {
      "sectorId":24,
      "SectorName":"Sector Two",
      "departments":[
         {
            "deptName":"Consulting",
            "jobtitles":[
               {
                  "JobTitleID":191,
                  "DepartmentID":92,
                  "JobName":"Saw Shop Supervisor",
                  "Deleted":false,
                  "SortOrder":1
               },
               {
                  "JobTitleID":474,
                  "DepartmentID":92,
                  "JobName":"Senior Truss Designer - Part Time",
                  "Deleted":false,
                  "SortOrder":11
               }
            ]
         },
         {
            "deptName":"Administration",
            "jobtitles":[
               {
                  "JobTitleID":461,
                  "DepartmentID":114,
                  "JobName":"Sawyer",
                  "Deleted":false,
                  "SortOrder":7
               },
               {
                  "JobTitleID":278,
                  "DepartmentID":114,
                  "JobName":"Service Manager",
                  "Deleted":false,
                  "SortOrder":2
               }
            ]
         }
      ]
   }
]

根据上面给出的数据,很明显 sectorId: 5 有 2 个独立的部门 [Production and Design/Engineering]sectorId: 24 有 2 个独立的部门 [Consulting and Administration]..

const selectedSectors = [{sectorName: "Sector One", sectorId: 5}, {sectorName: "Sector Two", sectorId: 24}]

const departments = [{"DepartmentID":51,"SectorID":5,"Name":"Production","SortOrder":1},{"DepartmentID":52,"SectorID":5,"Name":"Design/Engineering","SortOrder":2},{"DepartmentID":92,"SectorID":24,"Name":"Consulting","SortOrder":8},{"DepartmentID":114,"SectorID":24,"Name":"Administration","SortOrder":5}]

我可以根据 DepartmentID 筛选职位数组并将其分组,但我无法根据部门 ID 将部门分组到每个部门

提示selectedSectorsdepartments 变量具有 sectorId .

请根据给定的输入帮助我实现上述给定的预期结果。非常感谢。

    const selectedSectors = [{sectorName: "Sector One", sectorId: 5}, {sectorName: "Sector Two", sectorId: 24}]

    const departments = [{"DepartmentID":51,"SectorID":5,"Name":"Production","SortOrder":1},{"DepartmentID":52,"SectorID":5,"Name":"Design/Engineering","SortOrder":2},{"DepartmentID":92,"SectorID":24,"Name":"Consulting","SortOrder":8},{"DepartmentID":114,"SectorID":24,"Name":"Administration","SortOrder":5}]

    const jobTitles = [{"JobTitleID":167,"DepartmentID":51,"JobName":"Production Manager","Deleted":false,"SortOrder":5},{"JobTitleID":294,"DepartmentID":52,"JobName":"Senior Truss Designer","Deleted":false,"SortOrder":5},{"JobTitleID":178,"DepartmentID":51,"JobName":"Production Supervisor","Deleted":false,"SortOrder":3},{"JobTitleID":191,"DepartmentID":92,"JobName":"Saw Shop Supervisor","Deleted":false,"SortOrder":1},{"JobTitleID":461,"DepartmentID":114,"JobName":"Sawyer","Deleted":false,"SortOrder":7},{"JobTitleID":461,"DepartmentID":66,"JobName":"Sawyer","Deleted":false,"SortOrder":7},{"JobTitleID":474,"DepartmentID":92,"JobName":"Senior Truss Designer - Part Time","Deleted":false,"SortOrder":11},{"JobTitleID":449,"DepartmentID":51,"JobName":"Senior Wall Panel Designer","Deleted":false,"SortOrder":15},{"JobTitleID":278,"DepartmentID":114,"JobName":"Service Manager","Deleted":false,"SortOrder":2}]
        
        
    const filteredData = selectedSectors.map(sector =>  {
 const deps = departments.filter(dep => dep.SectorID === sector.sectorId).flatMap(department => {
    const jobtitles= jobTitles.filter(
       (jobTitle) => jobTitle.DepartmentID === department.DepartmentID
    );
      const newObj = {
          deptName: department.Name,
          jobtitles,
      };
     return newObj;
    })
return {
  sectorId: sector.sectorId,
  sectorName: sector.sectorName,
  departments: deps,
}
});

    console.log('filteredData ', filteredData)