У меня есть некоторые данные о пользователях и разрешениях, которые запрашиваются из моей базы данных. Я хотел бы, чтобы объект доступа для каждого человека был связан с объектом каждого пользователя, чтобы, когда я просматриваю массив в своем приложении на странице разрешений пользователя, все данные были легко доступны.

К счастью, мои данные, которые необходимо объединить, находятся в порядке индексации.

Вопрос: Как мне соединить объект доступа с объектом пользователя на основе Id.

Моя попытка:

const data = permissions.map((perm, pIndex) => {
  return users.map((user, uIndex) => {
    return pIndex === uIndex;
  });
});

Мои данные:

user = [{
    firstName: "Стив",
    возраст: 22,
    _id: "789"
  },
  {
    fistName: "bill",
    возраст: 18,
    _id: "456"
  },
  {
    firstName: "jeff",
    возраст: 15,
    _id: "123"
  }
]

разрешения = [{
    userId: "789",
    доступ: ["321", "654"]
  },
  {
    идентификатор пользователя: "456",
    доступ: ["654"]
  },
  {
    userId: "123",
    доступ: ["321", "654", "987"]
  },
]

Желаемый результат:

user = [{
    firstName: "Стив",
    возраст: 22,
    _id: "789",
    access: ["321", "654"]
  },
  {
    fistName: "bill",
    возраст: 18,
    _id: "456",
    access: ["654"]
  },
  {
    firstName: "jeff",
    возраст: 15,
    _id: "123",
    access: ["321", "654", "987"]
  }
]

Мой текущий вывод имеет неопределенные значения, смешанные в массиве, как:

[{obj}, undefined, undefined],
[undefined, {obj}, undefined],
[undefined, undefined, {obj}]
.

Спасибо!

Ответы (3)

Вы можете использовать .find для получения разрешения по userId:

const users = [
  { firstName: "steve", age: 22, _id: "789" },
  { fistName: "bill", возраст: 18, _id: "456" },
  { firstName: "jeff", возраст: 15, _id: "123" }
];

const permissions = [
  { userId: "789", access: ["321", "654"] },
  { userId: "456", доступ: ["654"] },
  { userId: "123", доступ: ["321", "654", "987"] },
];

const res = users.map(user => {
  const { access = [] }
    = permissions.find(permission => permission.userId===user._id) || {};
  return { ... user, access }
});

console.log(res);

Преобразуйте разрешения в карту по id, затем создайте карту users и возьмите access из карты по _id пользователя:

const fn = (users, permissions) => {
  // создаем карту, используя id в качестве ключа, а остальную часть объекта в качестве значения
  const permissionsMap = new Map(permissions.map(({ userId, ...rest }) => [userId, rest])))
  
  // объединяем пользователей с соответствующим доступом из Карты
  return users.map(o => ({ ...o, ...permissionsMap.get(o._id) }))
}

const users = [{"firstName":"steve","age":22,"_id":"789"},{"fistName":"bill","age":18,"_id":"456"},{"firstName":"jeff","age":15,"_id":"123"}]
const permissions = [{"userId":"789","access":["321","654"]},{"userId":"456","access":["654"]},{"userId":"123","access":["321","654","987"]}]

const result = fn(users, permissions)

console.log(result)

Вы можете просто использовать reduce, посмотрите ниже

var users = [{
    firstName: "Стив",
    возраст: 22,
    _id: "789"
  },
  {
    fistName: "bill",
    возраст: 18,
    _id: "456"
  },
  {
    firstName: "jeff",
    возраст: 15,
    _id: "123"
  }
]

var permissions = [{
    userId: "789",
    доступ: ["321", "654"]
  },
  {
    идентификатор пользователя: "456",
    доступ: ["654"]
  },
  {
    userId: "123",
    доступ: ["321", "654", "987"]
  },
]

var data = users.reduce((array, item) => {
  item.access = permissions.find((f) => f.userId == item._id).access;
  array.push(item)
  return array;
}, [])
console.log(data);

2022 WebDevInsider