如何通过 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=])
})
我有一个相同的 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=])
})