如何过滤 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: "")