根据另一个数组的ID检索数组

时间:2020-01-29 14:31:57

标签: arrays swift collections set sequence

我有两个用户和波束阵列

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

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

如果用户选择特定的光束,则将分配给该光束的所有用户作为第一个阵列。用户可以选择多个波束,而我正在从api响应中获取数据,并且我必须在邮局电话中发送选定的用户。因此,我必须从波束数组中选择所有选定的用户,并在过滤后的ID的基础上,在发帖后发送该数组。最初,我要过滤所有这样选择的光束

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

这给了我[Int]数组。这些是必须发送的userId。我以某种方式无法弄清楚如何从包含其他属性的用户数组中选择这些特定ID。 contains可用于过滤一个元素,但不能过滤序列。即使我过滤或使用这些ID和我的userArray的交集。我仍然剩下一组或一组ID。从中我必须生成我的数组,我也想保留所有其他属性。任何在正确方向上的帮助将不胜感激。我脑子里有这种性质的东西

   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 个答案:

答案 0 :(得分:1)

尝试

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)收集选定波束中的所有用户ID

3)通过检查ID是否存在于先前收集的ID中来过滤用户。