點燈坊

失くすものさえない今が強くなるチャンスよ

使用 sortWith() 針對多條件排序

Sam Xiao's Avatar 2020-09-17

Ramda 的 sort()sortBy() 都只能針對單一排序條件;若要多排序條件只能使用 sortWith()

Version

macOS Catalina 10.15.3
Ramda 0.27.1

sortWith()

import { sortWith } from 'ramda'

let data = [
  { id: 1, title: 'FP in JavaScript', price: 200 },
  { id: 2, title: 'RxJS in Action', price: 400 },
  { id: 3, title: 'RxJS in Action', price: 200 },
  { id: 4, title: 'JavaScript: The Good Parts', price: 100 }
]

sortWith([
  (x, y) => y.price - x.price,
  (x, y) => x.id - y.id
], data) // ?

10 行

sortWith([
  (x, y) => y.price - x.price,
  (x, y) => x.id - y.id
], data) // ?

sort()sortBy() 都只能提供單一排序條件,如需求為根據 price 以 desend 排序,若 price 相同則以 id ascend 排序,同時要滿足這兩個排序條件,就得用 sortWith()

sortWith()
[(a, a) → Number] → [a] → [a]
將 array 根據多個 comparator function 加以排序

[(a, a) → Number]:多個 comparator function 所形成 Array

[a]:data 為 Array

[a]:回傳新 Array,型別完全相同,只是順序不同

sortwith000

Point-free

import { sortWith, prop, ascend, descend } from 'ramda'

let data = [
  { id: 1, title: 'FP in JavaScript', price: 200 },
  { id: 2, title: 'RxJS in Action', price: 400 },
  { id: 3, title: 'RxJS in Action', price: 200 },
  { id: 4, title: 'JavaScript: The Good Parts', price: 100 }
]

sortWith([
  descend(prop('price')),
  ascend(prop('id')),
], data) // ?

也可以使用 ascend()descend()prop() 產生 comparator function。

sortwith002

Conclusion

  • 可使用 ascend()descend()prop() 等產生 callback function 達成 point-free

Reference

Ramda, sortWith()
Ramda, ascend()
Ramda, descend()
Ramda, prop()