如何使用 ramda 的 sortBy 函数降序排序?
How to sort in descending order with ramda's sortBy function?
当使用 ramda 的 sort 函数时,我可以使用 descend 函数来创建降序比较器:
console.log(R.sort(R.descend(R.prop(0)))([[2],[3],[1]]))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
使用 sortBy 这不起作用。默认情况下,列表按升序排序。
R.sortBy(R.prop(0))([[2],[3],[1]])
我能想到的唯一解决办法是在排序后显式反转列表,但是有没有更优雅的方法来实现呢?
更新:
对于sortBy
,您需要反转结果值以影响排序方向。这可以通过一个小的 desc
函数来完成:
const desc = a => -a;
const customSort = R.sortBy(R.compose(desc, R.prop(0)));
customSort([[1], [3], [2], [4]]);
// Result: [[4], [3], [2], [1]]
上一个答案使用 sortWith
:
sortWith
会得到你想要的结果。
const customSort = R.sortWith([R.descend(R.prop(0))]);
customSort([[1], [3], [2], [4]]);
// Result: [[4], [3], [2], [1]]
Ramda 有几种不同的排序功能。
最熟悉的是 sort
,它本质上是 Array.prototype.sort
方法的非变异纯函数版本。你传递给它一个比较器:一个二进制函数,它必须 return 一个数字。如果数字为负数,则第一个参数在结果中位于第二个参数之前;如果是正数,则第二个参数先于第一个参数;它是零,你没有表示偏好,尽管现在大多数实现都是稳定的,这意味着第一个参数会出现。
sortWith
是一种将多个此类比较器串在一起的方法。如果您想按姓氏排序,并且 - 如果它们相同 - 按名字排序,您可以传递一个姓氏比较器和一个名字比较器,它将按您的需要排序。
为了帮助创建这样的比较器函数,Ramda 还提供 ascend
和 descend
,它们接受 return 有序类型的函数,例如内置的 String、Number和日期类型,或任何具有适当 valueOf
方法的类型,以及 return 可以传递给 sort
的比较器。因此,如果您要排序的每个对象都有一个数字 age
属性,您可以通过将 descend(o => o.age)
(相当于 descend(prop('age'))
)传递给 [=20] 来按年龄递减对它们进行排序=] 或 Array.prototype.sort
或 -- 作为比较器数组之一 -- 到 R.sortWith
.
但通常情况下,我们想要更简单的东西。 我只想按类型代码对它们进行排序。对于最简单的情况,Ramda 提供 sortBy
,它不需要比较器,而只是一个 return 某种有序类型的函数。最常见的是通过简单地从对象中提取 属性 来使用它:sortBy(prop('type'))
,但你可以做任何你喜欢的转换。
但是 sortBy
没有等价于 ascend
/descend
的东西。虽然当然可以编写类似的内容,但 sort(a/descend(myFunc))
.
已经涵盖了它
当使用 ramda 的 sort 函数时,我可以使用 descend 函数来创建降序比较器:
console.log(R.sort(R.descend(R.prop(0)))([[2],[3],[1]]))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
使用 sortBy 这不起作用。默认情况下,列表按升序排序。
R.sortBy(R.prop(0))([[2],[3],[1]])
我能想到的唯一解决办法是在排序后显式反转列表,但是有没有更优雅的方法来实现呢?
更新:
对于sortBy
,您需要反转结果值以影响排序方向。这可以通过一个小的 desc
函数来完成:
const desc = a => -a;
const customSort = R.sortBy(R.compose(desc, R.prop(0)));
customSort([[1], [3], [2], [4]]);
// Result: [[4], [3], [2], [1]]
上一个答案使用 sortWith
:
sortWith
会得到你想要的结果。
const customSort = R.sortWith([R.descend(R.prop(0))]);
customSort([[1], [3], [2], [4]]);
// Result: [[4], [3], [2], [1]]
Ramda 有几种不同的排序功能。
最熟悉的是 sort
,它本质上是 Array.prototype.sort
方法的非变异纯函数版本。你传递给它一个比较器:一个二进制函数,它必须 return 一个数字。如果数字为负数,则第一个参数在结果中位于第二个参数之前;如果是正数,则第二个参数先于第一个参数;它是零,你没有表示偏好,尽管现在大多数实现都是稳定的,这意味着第一个参数会出现。
sortWith
是一种将多个此类比较器串在一起的方法。如果您想按姓氏排序,并且 - 如果它们相同 - 按名字排序,您可以传递一个姓氏比较器和一个名字比较器,它将按您的需要排序。
为了帮助创建这样的比较器函数,Ramda 还提供 ascend
和 descend
,它们接受 return 有序类型的函数,例如内置的 String、Number和日期类型,或任何具有适当 valueOf
方法的类型,以及 return 可以传递给 sort
的比较器。因此,如果您要排序的每个对象都有一个数字 age
属性,您可以通过将 descend(o => o.age)
(相当于 descend(prop('age'))
)传递给 [=20] 来按年龄递减对它们进行排序=] 或 Array.prototype.sort
或 -- 作为比较器数组之一 -- 到 R.sortWith
.
但通常情况下,我们想要更简单的东西。 我只想按类型代码对它们进行排序。对于最简单的情况,Ramda 提供 sortBy
,它不需要比较器,而只是一个 return 某种有序类型的函数。最常见的是通过简单地从对象中提取 属性 来使用它:sortBy(prop('type'))
,但你可以做任何你喜欢的转换。
但是 sortBy
没有等价于 ascend
/descend
的东西。虽然当然可以编写类似的内容,但 sort(a/descend(myFunc))
.