根据匹配的内容合并数组的内容

Merging contents of an array based on matching content

我正在编写一些 Google Apps 脚本来获取每个 Google 组并列出其成员,然后将其输出到 Google Sheet。目前,我正在抓取每个组和电子邮件地址并将其推送到 memberArr,但是我想 'merge' 相关信息。

例如,如果我有 X 个组,组 1 有 4 个成员(Foo、Bar、Baz 和 Quux)- 目前,它将输出为

[ [ 'Group 1', 'Foo' ],
  [ 'Group 1', 'Bar' ],
  [ 'Group 1', 'Baz' ],
  [ 'Group 1', 'Quux' ] ]

但我想让它输出为 [Group 1, Foo, Bar, Baz, Quux]
也就是合并有共同Group

memberArr的内容

到目前为止,这是我的代码:

function getAllGroupsTEST() {
  const groupArr = [];
  let gPageToken;
  let gPage;

  do {
    gPage = AdminDirectory.Groups.list({
      customer: "my_customer",
      maxResults: 100,
      gPageToken
    });
    const groups = gPage.groups;

    if (groups) {
      groups.forEach(({email}) => {
        const groupEmail = email;
        groupArr.push(groupEmail);
      });
    }

    gPageToken = gPage.nextPageToken;
  } while (gPageToken);

  console.log(`LOGGING GROUPS:\n\n${groupArr}`);
  const memberArr = [];
  let mPageToken;
  let mPage;

  groupArr.forEach(group => {
    mPage = AdminDirectory.Members.list(group,{
      customer: "my_customer",
      maxResults: 500,
      mPageToken
    })
    const members = mPage.members;
    if (members) {
      // console.log(`LOGGING ${members.length} MEMBERS FOR ${group}\n\n${members}`)
      members.forEach(member => {
        // console.log(`MEMBER: ${member.email} IS IN GROUP ${group}`)
        memberArr.push([group, member.email])
      })
    }
  })
  // console.log(`COUNTED ${groupArr.length} GROUPS`)
  // console.log(memberArr)
}

如有任何帮助,我们将不胜感激!

编辑:已更新以按原样显示 memberArr 而不是 table 格式。

您可以为每个要过滤的组实现这个简单的功能

考虑到这将消除数组的每个重复项。

const dataToFiler = [['Group 1', 'Foo'],
['Group 1', 'Bar'],
['Group 1', 'Baz'],
['Group 1', 'Quux']]

const filterRD = (arr) => {
  return [...new Set(arr.flat())]
}

console.log(filterRD(dataToFiler))

文档

我建议将对象中的数组转换为数组,然后再返回数组:

var arr = [
    ['group1','a'],
    ['group1','b'],
    ['group2','c'],
    ['group2','d'],
    ['group3','e']
]

var obj = {}
for (var a of arr) {
    try { obj[a[0]].push(a[1]) }
    catch(e) { obj[a[0]] = [a[1]] }
}
console.log(obj);

var new_arr = [];
for (var group in obj) {
    new_arr.push([group, ...obj[group]])
}
console.log(new_arr);

输出:

[ [ 'group1', 'a', 'b' ], [ 'group2', 'c', 'd' ], [ 'group3', 'e' ] ]

我喜欢@YuriKhristich 的解决方案。但是,我仍然想 post 这段代码展示了如何对现有代码进行一些小的更改以构建所需的数据结构。

我们首先使用群组电子邮件初始化一个列表。接下来,我们将所有成员的电子邮件附加到列表中。最后我们将完成的列表推送给 memberArr。优点是这会在读取数据时构建所需的数据格式,而不是在之后尝试重新处理它。

    let list = [group];  // <-- ADD

    if (members) {
        members.forEach(member => {
          
          // memberArr.push([group, member.email])  <-- REMOVE
          
          list.push(member.email);   // <-- ADD
          
        })
        memberArr.push(list);  // <-- ADD
     }
  })

// Simulated Google Groups data

var gPage = {
  groups: [
    {id: 1, name: "Group 1", email: "group1@emal.com" },
    {id: 2, name: "Group 2", email: "group2@emal.com" },
    {id: 3, name: "Group 3", email: "group3@emal.com" }
  ]
};

var mPage = { 
  members: [
    {id: 1, role: "admin", email: "member1@email.com" },
    {id: 2, role: "admin", email: "member2@email.com" },
    {id: 3, role: "admin", email: "member3@email.com" },
    {id: 4, role: "admin", email: "member4@email.com" },
    {id: 5, role: "admin", email: "member5@email.com" }
  ]
};


function getAllGroupsTEST() {

  const groupArr = [];
  let gPageToken;
  //let gPage;

  do {
    
    /* useing fake data
    gPage = AdminDirectory.Groups.list({
      customer: "my_customer",
      maxResults: 100,
      gPageToken
    });
    */
    
    const groups = gPage.groups;

    if (groups) {
      groups.forEach(({email}) => {
        const groupEmail = email;
        groupArr.push(groupEmail);
      });
    }

    gPageToken = gPage.nextPageToken;

  } while (gPageToken);



  const memberArr = [];
  let mPageToken;
  //let mPage;

  groupArr.forEach(group => {
  
     /* using fake data
      mPage = AdminDirectory.Members.list(group,{
        customer: "my_customer",
        maxResults: 500,
        mPageToken
      })
    */


    const members = mPage.members;

    let list = [group];

    if (members) {
        members.forEach(member => {
          
          // memberArr.push([group, member.email])
          
          list.push(member.email);
          
        })
        
        memberArr.push(list);
        
     }
    
  })

  return memberArr;

}

console.log( getAllGroupsTEST() );