Получить массив на основе идентификаторов другого массива - PullRequest
0 голосов
/ 29 января 2020

У меня есть два массива пользователей и лучей

struct User {
   var id: Int
   var jobTitle: String
 }

struct Beams {
 var isSelected = false
 var id: Int
 var userIds: [Int]
}

Если пользователь выбирает конкретный луч, все пользователи, которые назначены этому лучу, будут выбраны из первого массива. Пользователь может выбрать несколько лучей, и я получаю данные из ответа API, и я должен отправить выбранных пользователей в виде пост-звонка. поэтому я должен выбрать всех выбранных пользователей из массива балок и на основе отфильтрованных идентификаторов отправить этот массив в виде пост-звонка. Первоначально я фильтрую все лучи, которые выбраны, как это

beams.filter { $0.isSelected }.compactMap { $0.userIDS }

, что дает мне массив [Int]. Это userIds, которые должны быть отправлены. Я почему-то не могу понять, как я выберу эти конкретные идентификаторы из моего массива пользователей, который также содержит другие атрибуты. Содержимое может использоваться для фильтрации одного элемента, но не последовательности. и даже если я фильтрую или принимаю пересечение этих идентификаторов и моего userArray. я все еще остался с набором или массивом идентификаторов. из которого мне нужно будет сгенерировать мой массив, я хочу сохранить и все остальные атрибуты. Любая помощь в правильном направлении будет принята с благодарностью. У меня в голове есть нечто подобное

   let selectedBeamsIds = beams.filter { $0.isSelected }.compactMap { $0.userIDS }
   users.append(selectedBeamsIds.compactMap { getUniqueUsersForBeams(ids: $0) } )

  private func getUniqueUsersForBeams(ids: [Int]) -> [User] {

    let ower = users.reduce(into: [User]()) { (result, 
     user) in

      let filteredUserIds = ids.filter { $0 == user.id }
        //result.append(use)

    }
}

Мне также нужно сделать это с другим массивом jobTitles, который похож на

struct JobTitle {
 var jobTitle: String
 var isSelected = false
 }

, этот простой, как если бы пользователь jobTitle соответствует выбранным элементам массива [String], затем выберите пользователя для отправки.

1 Ответ

1 голос
/ 29 января 2020

Try,

let selectedIds = beams.filter { (beams) -> Bool in
    beams.isSelected
}.flatMap { (beams) -> [Int] in
    beams.userIds
}

let filteredUsers = users.filter { (user) -> Bool in
    selectedIds.contains(user.id)
}

1) Отфильтровать выбранные лучи

2) Собрать все идентификаторы пользователя в выбранных лучах

3) Отфильтровать пользователей, проверив, Идентификатор присутствует в ранее собранных идентификаторах.

...