如何将嵌套对象数组转换为用户-项目关联结构?
数组结构转换:从项目主体到用户主体的实现方案
需求说明
需要将以下以项目为核心的嵌套数组:
[ { projectId: 'abc123', name: 'Project 1', userProjects: [ { userId: 'xyz789', projectId: 'abc123', user: { userId: 'xyz789', email: 'user1@test.com' }, }, { userId: 'sdf012', projectId: 'abc123', user: { userId: 'sdf012', email: 'user2@test.com' }, }, ], }, { projectId: 'def456', name: 'Project 2', userProjects: [ { userId: 'xyz789', projectId: 'def456', user: { userId: 'xyz789', email: 'user1@test.com' }, }, ], }, ]
转换为以用户为核心的结构:
[ { userId: 'xyz789', email: 'user1@test.com', projects: [ { projectId: 'abc123', name: 'Project 1' }, { projectId: 'def456', name: 'Project 2' }, ], }, { userId: 'sdf012', email: 'user2@test.com', projects: [ { projectId: 'abc123', name: 'Project 1' }, ], }, ]
最佳动态实现方式
核心逻辑是用Map按userId分组用户,遍历每个项目的用户关联记录,把项目信息归集到对应用户的条目里。代码实现如下:
function transformProjectsToUsers(projects) { const userMap = new Map(); // 遍历每个项目 projects.forEach(project => { // 遍历项目下的所有用户关联关系 project.userProjects.forEach(userProject => { const { user } = userProject; // 提取当前项目的关键信息 const projectInfo = { projectId: project.projectId, name: project.name }; // 若用户已存在,直接追加项目 if (userMap.has(user.userId)) { userMap.get(user.userId).projects.push(projectInfo); } else { // 用户不存在则新建条目存入Map userMap.set(user.userId, { ...user, projects: [projectInfo] }); } }); }); // 将Map中的用户对象转换为数组返回 return Array.from(userMap.values()); } // 调用示例 const originalData = [/* 原数组内容 */]; const result = transformProjectsToUsers(originalData); console.log(result);
关于原数组修改的问题
不建议直接修改原数组:原数组是以项目为核心组织数据,目标结构是以用户为核心,两者数据逻辑完全不同,强行修改原数组会导致数据混乱,还会破坏原数据的可用性。
正确做法是新建独立的转换函数,返回全新的数组,原数组保持不变。这种方式无副作用,也方便后续复用转换逻辑。
内容的提问来源于stack exchange,提问作者Muzammil Ahmed
相关产品推荐
相关产品推荐

