You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将嵌套对象数组转换为用户-项目关联结构?

数组结构转换:从项目主体到用户主体的实现方案

需求说明

需要将以下以项目为核心的嵌套数组:

[
    {
        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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:15:23