Ios 在swift中筛选具有特定属性的两个列表

Ios 在swift中筛选具有特定属性的两个列表,ios,swift,filter,Ios,Swift,Filter,假设我有两个不同的结构 struct ItemA:Hashable, Codable, Identifiable { var id: Int var itemBId: [Int] } struct ItemB:Hashable, Codable, Identifiable { var id: Int var isSelected: Bool } 假设我有一个ItemA和ItemB对象列表,分别称为“itemAs”和“itemBs” 某些itemBs对象可能具有

假设我有两个不同的结构

struct ItemA:Hashable, Codable, Identifiable {
    var id: Int
    var itemBId: [Int]
}

struct ItemB:Hashable, Codable, Identifiable {
    var id: Int
    var isSelected: Bool
}
假设我有一个ItemA和ItemB对象列表,分别称为“itemAs”和“itemBs”

某些itemBs对象可能具有isSelected=true

因此,我只想过滤并显示ItemA对象,其中包含itemB索引,它位于itemBs的true case列表中

var filteredItemAbyItemB: [Bird] {
    
    let itemBFilter = modelData.itemBs.filter {$0.isSelected})
    
    modelData.itemAs.filter {
        itemA -> Bool in
        itemBFilter.contains(itemA.itemBId)  // fail here
    }
}
我可以知道怎么做吗

范例 ItemB对象:

ib1 = {1, true}
ib2 = {2, false}
ib3 = {3, true}
itemBFilter应该包含对象ib1和ib3

ItemA对象:

ia1 = {1, [1,2]} // should appear in the final list, cause has itemBid = 1
ia2 = {2, [1]}   // should appear in the final list, cause has itemBid = 1
ia3 = {3, [2]}
ia4 = {4, [2,3]} // should appear in the final list, cause has itemBid = 3

最终过滤结果应该包含对象ia1、ia3和ia4

我想您可以试试这个

    // Your items
    let itemsB = [ItemB(id: 1, isSelected: true),
                  ItemB(id: 2, isSelected: false),
                  ItemB(id: 3, isSelected: true)]
    let itemsA = [ItemA(id: 1, itemBId: [1, 2]),
                  ItemA(id: 2, itemBId: [1]),
                  ItemA(id: 3, itemBId: [2]),
                  ItemA(id: 4, itemBId: [2, 3])]
    // I filter and map itemsB to get selected Ids
    let itemsBselectedIds = itemsB.filter { $0.isSelected }.map { $0.id }
    // Then I filter itemsA to verify if the itemA has a selected Id from itemsB
    let filter = itemsA.filter { itemA in
        itemsBselectedIds.contains(where: { itemA.itemBId.contains($0) })
    }

在代码中,您尝试验证itemsB是否包含
itemA.id
,但itemsB是
ItemB
的数组,而不是id
[Int]
的数组。最好使用集合来避免多个包含:

let selectedBIds = modelData.itemBs
  .filter { $0.isSelected }
  .map(\.id)

let filteredAWithAllBsSelected = modelData.itemAs.filter { Set($0.itemBId).isSubset(of: selectedBIds) }
let filteredAWithAtLeastOneBSelected = modelData.itemAs.filter { !Set($0.itemBId).intersection(selectedBIds).isEmpty }
请注意,您没有在问题中指定是否希望选择所有b,但您的预期结果表明了这一点。也许你还需要考虑空的b,那么你想在你的结果中也出现没有b的a吗?这取决于您是否希望至少选择一个b或不选择所有b