json 更改对象的嵌套数组

qv7cva1a  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(115)

const项目= [

  {

    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' },

    ],

  },

];

我被困在这个问题上。什么是最好的动态方法来做到这一点?我试图Map数组,但我与内部对象的“用户”混淆。我们可以直接改变这个数组,或者我们只需要创建一个新的函数?
我试图Map数组,但我与内部对象'user'混淆。我们可以直接更改此数组还是只需创建一个新函数?`

jdg4fx2g

jdg4fx2g1#

这使用了一个reduce,里面有一个forEach来构建一个对象。你可以使用这个对象来通过id查找一个用户,或者你可以使用Object.values来获取一个所有用户的数组。

const projects = [{
    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' },
      },
    ],
  },
];

const lookup = projects.reduce((acc, el) => {
  el.userProjects.forEach(up => {
    const id = up.userId;
    
    if (!acc[id]) {
      acc[id] = {
        userId: id,
        email: up.user.email,
        projects: []
      };
    }
      
    acc[id].projects.push({projectId: el.projectId, name: el.name});
  });
  
  return acc;
}, {});

console.log("single user -->", lookup["xyz789"]);

const output = Object.values(lookup);
console.log("all users -->", output);

相关问题