如何过滤 Observable 元素的数组 |接收迅捷
How to filter array of Observable element | RxSwift
我有一个 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)
现在如何按相关人员姓名过滤此数组?
例如我想要一个包含以 'M'
开头的人 name
的可观察序列
如何操作??
试试这个:
let seq = Observable.just(personArray)
seq.just(personArray)
.map{
[=10=].filter{ [=10=].name.hasPrefix("M")}
}
.subscribe(onNext: { item in
print(item)
})
你也可以这样做:
let seq = Observable.just(personArray.filter{ [=11=].name.hasPrefix("M") })
这是一个简单的 playground 示例,我用它来制作相同问题的原型:
import RxSwift
let dataSource = Observable.just([1, 2, 3, 4, 5])
let filterSource = PublishSubject<Int>()
Observable
.combineLatest(dataSource, filterSource) { data, filter in data.filter { [=10=] != filter } }
.subscribe(onNext: { print([=10=]) })
filterSource.onNext(3)
filterSource.onNext(2)
print("Done")
这会打印:
[1, 2, 4, 5]
[1, 3, 4, 5]
Done
克里斯的回答对我来说是正确的。我也想分享我的实现,我有一个需要从搜索栏中过滤的对象的表视图。
你会注意到我有
- 卡片
- 筛选卡片
- cardToSearch
.
override init(){
super.init()
cards = loadCardsRx().asObservable()
filteredCards = Observable.combineLatest(cards, cardToSearch){ data, filter in
data.filter{ [=10=].naziv?.lowercased().hasPrefix(filter.lowercased()) ?? true}}
}
var cards:Observable<[Card]>!
var filteredCards:Observable<[Card]>!
var cardToSearch:BehaviorRelay<String> = BehaviorRelay<String>(value: "")
我什至尝试删除 filteredCards observable 并将卡片重新分配为过滤后的卡片,它有效但我不确定它是否正确,也许更有经验的人可以提供帮助有了这个。
override init(){
super.init()
cards = loadCardsRx().asObservable()
cards = Observable.combineLatest(cards, cardToSearch){ data, filter in
data.filter{ [=11=].naziv?.lowercased().hasPrefix(filter.lowercased()) ?? true}}
}
var cards:Observable<[Card]>!
var cardToSearch:BehaviorRelay<String> = BehaviorRelay<String>(value: "")
我有一个 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)
现在如何按相关人员姓名过滤此数组?
例如我想要一个包含以 'M'
开头的人name
的可观察序列
如何操作??
试试这个:
let seq = Observable.just(personArray)
seq.just(personArray)
.map{
[=10=].filter{ [=10=].name.hasPrefix("M")}
}
.subscribe(onNext: { item in
print(item)
})
你也可以这样做:
let seq = Observable.just(personArray.filter{ [=11=].name.hasPrefix("M") })
这是一个简单的 playground 示例,我用它来制作相同问题的原型:
import RxSwift
let dataSource = Observable.just([1, 2, 3, 4, 5])
let filterSource = PublishSubject<Int>()
Observable
.combineLatest(dataSource, filterSource) { data, filter in data.filter { [=10=] != filter } }
.subscribe(onNext: { print([=10=]) })
filterSource.onNext(3)
filterSource.onNext(2)
print("Done")
这会打印:
[1, 2, 4, 5]
[1, 3, 4, 5]
Done
克里斯的回答对我来说是正确的。我也想分享我的实现,我有一个需要从搜索栏中过滤的对象的表视图。
你会注意到我有
- 卡片
- 筛选卡片
- cardToSearch
.
override init(){
super.init()
cards = loadCardsRx().asObservable()
filteredCards = Observable.combineLatest(cards, cardToSearch){ data, filter in
data.filter{ [=10=].naziv?.lowercased().hasPrefix(filter.lowercased()) ?? true}}
}
var cards:Observable<[Card]>!
var filteredCards:Observable<[Card]>!
var cardToSearch:BehaviorRelay<String> = BehaviorRelay<String>(value: "")
我什至尝试删除 filteredCards observable 并将卡片重新分配为过滤后的卡片,它有效但我不确定它是否正确,也许更有经验的人可以提供帮助有了这个。
override init(){
super.init()
cards = loadCardsRx().asObservable()
cards = Observable.combineLatest(cards, cardToSearch){ data, filter in
data.filter{ [=11=].naziv?.lowercased().hasPrefix(filter.lowercased()) ?? true}}
}
var cards:Observable<[Card]>!
var cardToSearch:BehaviorRelay<String> = BehaviorRelay<String>(value: "")