Reputation: 81
I want to improve my code. It's simple javascript code where I'm fetching some data from gitlab API and I want to get gitlab groups and their members, then I want to for each member display his groups.
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)
})
})
I want first get the list of groups and members of group. Then make array of distinct people and then give them their group. Please how can I remove nested foreach, is it even possible? And also I want to ask how to get only neccessary properties of member (like only name and id) to accounts array
Upvotes: 0
Views: 5208
Reputation: 19
You can simply do it by this:
let accounts = [];
let subGroups = await api.getSubgroups();
subGroups.forEach(group => {
let { id } = group;
let groupMembers = await api.getGroupMembers(id);
groupMembers.forEach(accounts.push)
})
Upvotes: 0
Reputation: 370689
If you have an X by Y data structure, and you need to iterate over all elements, that'll fundamentally require X * Y operations; there's nothing at all wrong with using a nested forEach
if that's what the logic requires.
In modern JS, there is a .flatMap
method available that'll make things a bit nicer, looking, though:
const accounts = subGroups.flatMap(group => group.groupMembers);
If you also want to extract only certain properties of each groupMember
, use the same technique you're doing initially when reorganizing the subGroups
array of objects.
const accounts = subGroups
.flatMap(group => group.groupMembers)
.map(({ name, id }) => ({ name, id }));
if you want to keep only the name
and id
properties.
Upvotes: 3