如果可能的话,如何避免嵌套的 forEach?

How to avoid nested forEach if it's possible?

我想改进我的代码。这是简单的 javascript 代码,我从 gitlab API 获取一些数据,我想获取 gitlab 组及其成员,然后我想为每个成员显示他的组。

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

我想先获取群组列表和群组成员。然后制作一组不同的人,然后给他们他们的小组。 请问如何删除嵌套的foreach,甚至可能吗?而且我还想问一下如何仅将成员的必要属性(例如仅名称和 ID)获取到帐户数组

如果您有一个 X x Y 数据结构,并且需要遍历所有元素,那基本上需要 X * Y 操作;如果这是逻辑要求,那么使用嵌套 forEach 完全没有错。

在现代 JS 中,有一个 .flatMap 方法可以使事情变得更好,但看起来:

const accounts = subGroups.flatMap(group => group.groupMembers);

如果您还想仅提取每个 groupMember 的某些属性,请使用您最初在重组 subGroups 对象数组时使用的相同技术。

const accounts = subGroups
  .flatMap(group => group.groupMembers)
  .map(({ name, id }) => ({ name, id }));

如果您只想保留 nameid 属性。

你可以简单地这样做:

let accounts = [];

let subGroups = await api.getSubgroups();

subGroups.forEach(group => {
  let { id } = group;
  let groupMembers = await api.getGroupMembers(id);
  groupMembers.forEach(accounts.push)
})