Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

85
Vistas
Mapeo y filtrado de matrices anidadas en javascript

Estoy diseñando un sistema y tengo algunos cuellos de botella.

Tengo una matriz de usuarios como esa:

 const users = [ { name: "Jack", workspaces: [ { _id: "61216512315615645jbk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, { _id: "41ss16512315615645bk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, ], }, { name: "Joe", workspaces: [ { _id: "71216512315615645jbk", permissions: ["CAN_DELETE_WORKSPACE"], }, ], }, ];

Y tengo un objeto activeWorkspace como ese:

 const activeWorkspace = { name: "W1", _id: "61216512315615645jbk", };

Necesito filtrar los objetos en la matriz de usuarios cuyo espacio de trabajo _id es igual a activeWorkspace _id.

La salida debe ser así:

 { name: "Jack", workspaces: [ { _id: "61216512315615645jbk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, { _id: "41ss16512315615645bk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, ], }

¿Cómo puedo hacer eso?

Además: si queremos devolver una matriz, no un objeto, ¿cómo debemos hacerlo? Como eso:

 [{ name: "Jack", workspaces: [ { _id: "61216512315615645jbk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, { _id: "41ss16512315615645bk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, ], }]

Gracias

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Si solo hay una coincidencia. Necesitas usar find(). Dentro del método de búsqueda, desea usar some() para buscar una coincidencia de _id.

 const users = [ { name: "Jack", workspaces: [ { _id: "61216512315615645jbk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, { _id: "41ss16512315615645bk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, ], }, { name: "Joe", workspaces: [ { _id: "CHANGED_ID", permissions: ["CAN_DELETE_WORKSPACE"], }, ], }, ]; const activeWorkspace = { name: "W1", _id: "61216512315615645jbk", }; const active = users.find(function (user) { return user.workspaces.some( function (workspace) { return workspace._id === activeWorkspace._id; }); }); console.log(active); // Same thing as above, just done with a modern approach const active2 = users.find(({workspaces}) => workspaces.some(({_id}) => _id === activeWorkspace._id)); console.log(active2);


Ahora, si pudiera haber más de una coincidencia (su código original antes del error tipográfico, usaría filter() y some() para encontrar todos los usuarios que tienen el espacio de trabajo en su matriz.

 const users = [ { name: "Jack", workspaces: [ { _id: "61216512315615645jbk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, { _id: "41ss16512315615645bk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, ], }, { name: "Joe", workspaces: [ { _id: "61216512315615645jbk", permissions: ["CAN_DELETE_WORKSPACE"], }, ], }, ]; const activeWorkspace = { name: "W1", _id: "61216512315615645jbk", }; const active = users.filter(function (user) { return user.workspaces.some( function (workspace) { return workspace._id === activeWorkspace._id; }); }); console.log(active); // Same thing as above, just done with a modern approach const active2 = users.filter(({workspaces}) => workspaces.some(({_id}) => _id === activeWorkspace._id)); console.log(active2);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Ajusté los datos proporcionados por Joe para que no tenga permisos.

 const users = [{ name: "Jack", workspaces: [{ _id: "61216512315615645jbk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, { _id: "41ss16512315615645bk", permissions: ["CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT"], }, ], }, { name: "Joe", workspaces: [{ _id: "61216512315615645bk", permissions: ["CAN_DELETE_WORKSPACE"], }, ], }, ]; const activeWorkspace = { name: "W1", _id: "61216512315615645jbk", }; function findPermittedUser() { return users.filter(user => { let hasPermission = false user.workspaces.forEach(workspace => { if (activeWorkspace._id == workspace._id) { hasPermission = true } }) return hasPermission }) } console.log(findPermittedUser())

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puede usar el map y el filter para "filtrar" las identificaciones no deseadas del objeto de los users . Algo como :

 const users = [ { "name": "Jack", "workspaces": [ { "_id": "61216512315615645jbk", "permissions": [ "CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT" ] }, { "_id": "41ss16512315615645bk", "permissions": [ "CAN_DELETE_WORKSPACE", "CAN_EDIT_PROJECT" ] } ] }, { "name": "Joe", "workspaces": [ { "_id": "61216512315615645jbk", "permissions": [ "CAN_DELETE_WORKSPACE" ] } ] } ] const activeWorkspace = { name: "W1", _id: "61216512315615645jbk", }; const filteredUsers = users.map(item => ({ name : item.name, workspaces: item.workspaces.filter(user => user._id === activeWorkspace._id)} )); console.log(filteredUsers);

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda