如何通过 Observable 属性对项目数组进行排序?

Posted

技术标签:

【中文标题】如何通过 Observable 属性对项目数组进行排序?【英文标题】:How to sort an array of items by an Observable attribute? 【发布时间】:2019-05-17 12:17:35 【问题描述】:

我有一个相同的 class= Observable 的 Observable 对象数组。 MyClass 包含一个 Observable 属性 sortAttribute = Observable。 我想根据可观察到的排序属性对数组进行排序。

class MyClass 

    let title:String
    let sortAttribute:Observable<Int>

    init(withTitle title:String, andSortValue sortValue: Int) 
        self.title = title
        self.sortAttribute = Observable.just(sortValue)
    



let arrayToSort:Observable<[MyClass]> = Observable.just([
    MyClass(withTitle: "A", andSortValue: 4),
    MyClass(withTitle: "B", andSortValue: 2),
    MyClass(withTitle: "C", andSortValue: 42),
    MyClass(withTitle: "D", andSortValue: 1337),
    MyClass(withTitle: "E", andSortValue: 24)
])

arrayToSort
    .subscribe(onNext:  ar in
        for element in ar 
            print(element.title)
        
    )

实际结果:

A //4
B //2
C //42 
D //1337 
E //24

预期结果:

B //2
A //4
E //24
C //42
D //1337

【问题讨论】:

【参考方案1】:
arrayToSort
    .flatMap  classes in
        Observable.combineLatest(
            classes.map  elem in
                elem.sortAttribute.map  (elem, $0) 
            
        )
    
    .map 
        $0.sorted(by:  a, b in a.1 < b.1 ).map  $0.0.title 
    
    .subscribe(onNext: 
        print($0)
    )

【讨论】:

是的,这就是我正在寻找的解决方案!谢谢!【参考方案2】:

试试这个:

arrayToSort
.subscribe(onNext:  ar in
        let sortedAr = ar.sorted(by:  $0.title < $1.title )
        for element in sortedAr 
            print(element.title)
        
    )

更新: 将您的排序属性设置为 NOT Observable... Just Int

class MyClass 

    let title:String
    let sortAttribute: Int

    init(withTitle title:String, andSortValue sortValue: Int) 
        self.title = title
        self.sortAttribute = sortValue
    


然后:

arrayToSort
    .subscribe(onNext:  ar in
            let sortedAr = ar.sorted(by:  $0.sortAttribute < $1.sortAttribute )
            for element in sortedAr 
                print(element.title)
            
        )

如果你将它保持为 Observable,你将不得不订阅每个 sortAttribute 提取它的 Int 然后以某种方式对其进行排序,对于简单的排序来说这是浪费处理能力...

【讨论】:

不,我不希望我的数组按“title”属性排序,而是按“sortAttribute”排序。我编辑了我的示例以使其更清晰。 "将您的排序属性设置为 NOT Observable...Just Int" > 我不会问我的问题是否可行。 我看不出拥有 Observable 有什么好处?

以上是关于如何通过 Observable 属性对项目数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

对一个 observable 数组进行排序,该数组已查询到由微风JS 返回的数据

如何获得仅在 redux 状态的对象数组中的属性值更改时才发出的 Observable?

如何过滤 Observable 数组?

如何通过嵌套对象属性对 JavaScript 对象数组进行排序?

在 RxSwift 中,我如何对 observable 未发送任何事件进行单元测试?

属性更改时 Observable 不更新列表