簡體   English   中英

如何連接無限數量的 Javascript 對象數組

[英]How to concatenate indefinite number of arrays of Javascript objects

我有一組組 st 每個組有很多用戶

我想返回給定組數組的所有(唯一)用戶。

到目前為止,我有

  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 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)];

在這里,我們可以循環使用.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);
            }
         }
      }
   }
}

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

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"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM