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

How to sort an array of items by an Observable attribute?

我有一个相同的 class = Observable<[MyClass]> 的 Observable of Objects 数组。 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

试试这个:

arrayToSort
.subscribe(onNext: { ar in
        let sortedAr = ar.sorted(by: { [=10=].title < .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: { [=12=].sortAttribute < .sortAttribute })
            for element in sortedAr {
                print(element.title)
            }
        })

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

arrayToSort
    .flatMap { classes in
        Observable.combineLatest(
            classes.map { elem in
                elem.sortAttribute.map { (elem, [=10=]) }
            }
        )
    }
    .map {
        [=10=].sorted(by: { a, b in a.1 < b.1 }).map { [=10=].0.title }
    }
    .subscribe(onNext: {
        print([=10=])
    })