【问题标题】:How to sort an array of items by an Observable attribute?如何通过 Observable 属性对项目数组进行排序?
【发布时间】: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

【问题讨论】:

    标签: ios swift observable rx-swift


    【解决方案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 有什么好处?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 2022-12-11
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多