【问题标题】:How to avoid nested forEach if it's possible?如果可能,如何避免嵌套 forEach?
【发布时间】:2022-01-15 15:52:39
【问题描述】:

我想改进我的代码。这是简单的 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)获取到帐户数组

【问题讨论】:

  • 您可以改进变量名称并防止重新分配相同的变量(子组)以提高可读性,但不能降低时间复杂度
  • @RameshReddy 是的,我会重命名,但它仍然是对象仍然是子组,但具有不同的属性
  • 嵌套结构需要嵌套循环。对此,您无能为力、不应该或不需要做任何事情。

标签: javascript node.js loops for-loop foreach


【解决方案1】:

如果你有一个 X by 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 }));

如果您只想保留 name 和 id 属性。

【讨论】:

  • 谢谢!这看起来很酷很干净。我会试试的。
【解决方案2】:

你可以这样做:

let accounts = [];

let subGroups = await api.getSubgroups();

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

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 2012-10-05
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多