0

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

kopkaa
  • 61
  • 1
  • 9
  • You can improve the variable names and prevent reassigning the same variable (subGroups) to improve readability, but you cannot reduce the time complexity – Ramesh Reddy Jan 15 '22 at 15:56
  • @RameshReddy Yes I would renamed, but it's still the object is still subGroup, but with different properties – kopkaa Jan 15 '22 at 15:59
  • Check this answer out: https://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet – Nandostyle Jan 15 '22 at 16:00
  • 1
    A nested structure requires a nested loop. There's nothing you can, should, or need to do about this. – Bergi Jan 15 '22 at 16:31

2 Answers2

2

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.

CertainPerformance
  • 356,069
  • 52
  • 309
  • 320
1

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)
})