【问题标题】:Retrieve array based on ids of another array根据另一个数组的 id 检索数组
【发布时间】:2020-05-15 02:01:58
【问题描述】:

我有两个用户数组和光束

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] 数组。这些是必须发送的用户 ID。我不知道如何从包含其他属性的用户数组中选择这些特定的 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] 数组的选定项匹配,然后选择要发送的用户。

【问题讨论】:

    标签: arrays swift collections set sequence


    【解决方案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 ) 收集所选光束中的所有 userId

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

    【讨论】:

    • 谢谢@subramanian,转换为一个数组而不是二维数组是有意义的。
    • 如果您觉得有帮助,请接受答案。干杯。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2022-11-10
    • 1970-01-01
    • 2016-06-02
    • 2011-05-17
    相关资源
    最近更新 更多