He estado trabajando en una pregunta de formato de datos y finalmente obtuve la respuesta.
Sin embargo, mi respuesta tiene demasiados bucles y ralentizará la complejidad del tiempo cuando se implemente.
A continuación se muestra mi código:
const userInfo = []; for (let i = 0; i < projects.length; i++) { const userProject = projects[i].userProjects; for (let j = 0; j < userProject.length; j++) { const userExist = userInfo.some((item) => item.userId.includes(userProject[j].user.userId) ); if (!userExist) userInfo.push(userProject[j].user); } } userInfo.forEach((user) => { let tempArr = []; for (let i = 0; i < projects.length; i++) { const userProject = projects[i].userProjects; for (let j = 0; j < userProject.length; j++) { if (user.userId === userProject[j].userId) tempArr.push({ projectId: projects[i].projectId, name: projects[i].name, }); } } user.project = tempArr; }); console.log(userInfo);¿Hay alguna manera de optimizar mi código? Traté de combinar los bucles for anidados, pero no funcionaba...
Por favor ayuda. ¡¡¡Muchas gracias!!!
En la parte superior, los dos bucles externos parecen necesarios (ya que tiene N proyectos * M userProjects), pero el tercero .some no lo es: cambie la información de userInfo de una matriz a una asignación de ID de usuario a sus usuarios, por lo que dentro del segundo loop, solo tiene que buscar para ver si el ID de usuario ya existe ( O(1) ), y asignarlo si no existe.
En lugar de asignar el usuario, asigne un objeto de la forma que necesita al final: un [{ projectId, name }] . Esto le evitará tener que pasar por toda la matriz nuevamente: una vez que haya verificado si necesita crear la matriz circundante para el userId de usuario, puede enviar el objeto a la matriz, ya sea que haya tenido que crear o no el matriz en esa iteración o no.
const userProjectsByUserId = new Map(); for (const { userProjects, projectId, name } of projects) { for (const { user } of projects) { if (!userProjectsByUserId.has(user.userId)) { userProjectsByUserId.set(user.userId, { user, projects: [] }]); } userProjectsByUserId.get(user.userId).projects.push({ projectId, name }); } }Esto te dará un mapa de la forma.
userId => { user, projects: [ { projectId, name }, ...Si necesita la estructura de datos exacta que le proporciona su código actual, luego, haga lo siguiente:
const output = [...userProjectsByUserId.values()] .map(({ user, projects }) => ({ ...user, project: projects })); (aunque podría considerar el uso de projects en lugar de project , ya que es una colección de proyectos, no un solo proyecto)