【问题标题】:How to concatenate indefinite number of arrays of Javascript objects如何连接不定数量的Javascript对象数组
【发布时间】:2020-02-15 00:30:03
【问题描述】:

我有一组组 s.t.每个组有很多用户

我想返回给定组数组的所有(唯一)用户。

到目前为止,我有

  let actor = await User.query().findById(req.user.id).eager('groups') // find the actor requesting


let actor_groups = actor.groups // find all groups of actor


  if (actor_groups.length > 1)
    var actor_groups_users = actor_groups[0].user
    for (let i = 0; i < actor_groups.length; i++) {
      const actor_groups_users = actor_groups_users.concat(actor_groups[i]);
    }
    console.log('actor groups users is', actor_groups_users);
  else 
    // return users from the first (only) group

返回错误:actor_groups_users is not defined

感觉像一个迂回的方式来做到这一点。有没有办法将 actor_groups 组合成一个组合组?

【问题讨论】:

  • 去掉这个const actor_groups_users = actor_groups_users.concat(actor_groups[i]);前面的const。你不想定义一个新变量,你想使用你已经定义的那个。
  • 如果你有一个数组数组,你可以使用较新的数组方法.flat()将它们全部组合起来。
  • 你如何确定用户的唯一性?通过对象的身份还是通过它们的 id?
  • ID。谢谢。我想我可以处理唯一性约束。将尝试平面方法。

标签: javascript arrays node.js express concatenation


【解决方案1】:

在这里,我们可以循环使用.forEach().includes() 添加用户(如果尚未在数组中)。

这是假设 group.user 是用户的数组

let users = [];

// check that actor_groups has items in it
if (actor_groups && actor_groups.length > 1) {

   // cycle through each actor_group
   actor_groups.forEach( group => {

      // check if we have a 'user' array with items in it
      if (group.user && group.user.length > 1) {

         // cycle through each user in the group
         group.user.forEach( user => {

            // check if we already have this user
            // if not, add it to users
            if (!users.includes(user)) {
               users.push(user);
            }
         }
      }
   }
}

【讨论】:

    【解决方案2】:

    你可以这样做:

    const allGroupsArrs = actor_groups.map(({ user }) => user);
    const actor_groups_users = [].concat(...allGroupArrs);
    

    或者,您可以简单地使用.flat() 方法,该方法尚未正式成为 ES 标准的一部分,但正在实现中,并且在 IE 之外提供浏览器支持:

    const allGroupsArrs = actor_groups.map(({ user }) => user);
    const actor_groups_users = allGroupArrs.flat();
    

    此外,如果有人在多个组中,上述操作会导致 actor_groups_users 中的重复值。您可以使用Set 来解决这个问题(假设数组元素是原始值):

    const unique_users = [...new Set(actor_groups_users)];
    

    【讨论】:

    • 如果我理解正确,actor_group 变量看起来像:[{user: ['ok','boom']}, {user: 'er'}],他想要 ['ok', 'boom', 'er']。所以这并不能回答问题。
    • 同样[...actor_groups]等价于[].concat(...actor_groups);
    • @YounesM 如果actor_groups 是数组数组,则不会。 [...actor_groups] 只是制作了 actor_groups 的浅拷贝,而 [].concat(...actor_groups) 将其展平。
    【解决方案3】:

    我能想到的最有效的方法是

    const users = [...new Set([...actor_groups].flatMap(el => el.user))]
    

    我用了这个例子:

    const actor_groups = [{user: ['ok','boom']}, {user: 'er'}]
    console.log([...new Set([...actor_groups].flatMap(el => el.user))])
    //output: ["ok", "boom", "er"]
    

    【讨论】:

      猜你喜欢
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2022-11-16
      • 2017-07-14
      相关资源
      最近更新 更多