如何过滤Observable元素的数组| RxSwift

时间:2017-02-11 17:47:25

标签: swift3 rx-swift

我有一个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的可观察序列

怎么做?

3 个答案:

答案 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)

克里斯的回答对我来说是正确的。我也想分享我的实现,我有一个需要从搜索栏过滤掉的对象的表视图。

您会发现我有

  • filteredCards
  • cardToSearch

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: "")