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