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

4
  • You can improve the variable names and prevent reassigning the same variable (subGroups) to improve readability, but you cannot reduce the time complexity Commented Jan 15, 2022 at 15:56
  • @RameshReddy Yes I would renamed, but it's still the object is still subGroup, but with different properties Commented Jan 15, 2022 at 15:59
  • Check this answer out: stackoverflow.com/questions/200574/… Commented Jan 15, 2022 at 16:00
  • 1
    A nested structure requires a nested loop. There's nothing you can, should, or need to do about this. Commented Jan 15, 2022 at 16:31

2 Answers 2

3

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks! That looks cool and clean. I will try.
0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.