Как объединить неопределенное количество массивов Javascript объектов - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть массив групп, в каждой группе много пользователей

Я хочу вернуть всех (уникальных) пользователей для данного массива групп.

Пока у меня есть

  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 в одну объединенную группу?

Ответы [ 3 ]

0 голосов
/ 14 февраля 2020

Здесь мы можем циклически проходить, добавляя пользователей, если их еще нет в массиве, используя .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);
            }
         }
      }
   }
}
0 голосов
/ 14 февраля 2020

Самый эффективный способ, которым я могу придумать, это

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"]
0 голосов
/ 14 февраля 2020

Вы можете просто сделать это:

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)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...