Quiero mejorar mi código. Es un código javascript simple donde estoy obteniendo algunos datos de la API de gitlab y quiero obtener grupos de gitlab y sus miembros, luego quiero que cada miembro muestre sus grupos.
let accounts = [] let subGroups = await api.getSubgroups(); subGroups = subGroups.map((group) => { const { id, name, full_path } = group; return { id, name, full_path } }) subGroups = subGroups.map(async (group) => { const { id } = group; const groupMembers = await api.getGroupMembers(id); return { group_id: id, groupMembers }; }); subGroups = await Promise.all(subGroups); const map = subGroups.forEach((group) => { group.groupMembers.forEach((member) => { accounts.push(member) }) })
Primero quiero obtener la lista de grupos y miembros del grupo. Luego haz una serie de personas distintas y luego dales su grupo. Por favor, ¿cómo puedo eliminar el foreach anidado? ¿Es posible? Y también quiero preguntar cómo obtener solo las propiedades necesarias del miembro (como solo el nombre y la identificación) en la matriz de cuentas
Si tiene una estructura de datos X por Y, y necesita iterar sobre todos los elementos, eso requerirá fundamentalmente operaciones X * Y; no hay nada de malo en usar un forEach
anidado si eso es lo que requiere la lógica.
Sin embargo, en JS moderno, hay un método .flatMap
disponible que hará que las cosas sean un poco más agradables:
const accounts = subGroups.flatMap(group => group.groupMembers);
Si también desea extraer solo ciertas propiedades de cada groupMember
, use la misma técnica que está haciendo inicialmente al reorganizar la matriz de objetos de los subGroups
.
const accounts = subGroups .flatMap(group => group.groupMembers) .map(({ name, id }) => ({ name, id }));
si desea mantener solo las propiedades de name
e id
.
Simplemente puede hacerlo así:
let accounts = []; let subGroups = await api.getSubgroups(); subGroups.forEach(group => { let { id } = group; let groupMembers = await api.getGroupMembers(id); groupMembers.forEach(accounts.push) })