我有一个struct Person和person数组,如下所示
struct Person {
let name : String
let age : Int
}
let personArray = [
Person(name : "Max", age : 32),
Person(name : "Jones", age : 42),
Person(name : "Other", age : 62)
]
我创建了一个可观察的序列,如下所示
let seq = Observable.just(personArray)
现在如何按相关人名过滤此数组?
e.g。我想要一个包含以{M'
开头的人name
的可观察序列
怎么做?
答案 0 :(得分:9)
试试这个:
let seq = Observable.just(personArray)
seq.just(personArray)
.map{
$0.filter{ $0.name.hasPrefix("M")}
}
.subscribe(onNext: { item in
print(item)
})
你也可以这样做:
let seq = Observable.just(personArray.filter{ $0.name.hasPrefix("M") })
答案 1 :(得分:2)
这是一个简单的游乐场示例,我曾用它来原型化相同的问题:
import RxSwift
let dataSource = Observable.just([1, 2, 3, 4, 5])
let filterSource = PublishSubject<Int>()
Observable
.combineLatest(dataSource, filterSource) { data, filter in data.filter { $0 != filter } }
.subscribe(onNext: { print($0) })
filterSource.onNext(3)
filterSource.onNext(2)
print("Done")
此打印:
[1, 2, 4, 5]
[1, 3, 4, 5]
Done
答案 2 :(得分:0)
克里斯的回答对我来说是正确的。我也想分享我的实现,我有一个需要从搜索栏过滤掉的对象的表视图。
您会发现我有
。
override init(){
super.init()
cards = loadCardsRx().asObservable()
filteredCards = Observable.combineLatest(cards, cardToSearch){ data, filter in
data.filter{ $0.naziv?.lowercased().hasPrefix(filter.lowercased()) ?? true}}
}
var cards:Observable<[Card]>!
var filteredCards:Observable<[Card]>!
var cardToSearch:BehaviorRelay<String> = BehaviorRelay<String>(value: "")
我什至尝试删除 filteredCards 可观察的卡片,然后将其重新分配为已过滤的卡片,它可以工作,但是我不确定是否正确,也许有经验的人可以帮助解决这个问题。
override init(){
super.init()
cards = loadCardsRx().asObservable()
cards = Observable.combineLatest(cards, cardToSearch){ data, filter in
data.filter{ $0.naziv?.lowercased().hasPrefix(filter.lowercased()) ?? true}}
}
var cards:Observable<[Card]>!
var cardToSearch:BehaviorRelay<String> = BehaviorRelay<String>(value: "")