如何通过 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?
如何通过嵌套对象属性对 JavaScript 对象数组进行排序?