如何使用 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]]

工作示例:https://ramdajs.com/repl/?v=0.26.1#?const%20desc%20%3D%20a%20%3D%3E%20-a%3B%0Aconst%20customSort%20%3D%20R.sortBy%28R.compose%28desc%2C%20R.prop%280%29%29%29%3B%0A%0AcustomSort%28%5B%5B1%5D%2C%20%5B3%5D%2C%20%5B2%5D%2C%20%5B4%5D%5D%29%3B

上一个答案使用 sortWith:

sortWith 会得到你想要的结果。

const customSort = R.sortWith([R.descend(R.prop(0))]);

customSort([[1], [3], [2], [4]]);

// Result: [[4], [3], [2], [1]]

工作示例:https://ramdajs.com/repl/?v=0.26.1#?const%20customSort%20%3D%20R.sortWith%28%5BR.descend%28R.prop%280%29%29%5D%29%3B%0A%0AcustomSort%28%5B%5B1%5D%2C%20%5B3%5D%2C%20%5B2%5D%2C%20%5B4%5D%5D%29%3B

Ramda 有几种不同的排序功能。

最熟悉的是 sort,它本质上是 Array.prototype.sort 方法的非变异纯函数版本。你传递给它一个比较器:一个二进制函数,它必须 return 一个数字。如果数字为负数,则第一个参数在结果中位于第二个参数之前;如果是正数,则第二个参数先于第一个参数;它是零,你没有表示偏好,尽管现在大多数实现都是稳定的,这意味着第一个参数会出现。

sortWith 是一种将多个此类比较器串在一起的方法。如果您想按姓氏排序,并且 - 如果它们相同 - 按名字排序,您可以传递一个姓氏比较器和一个名字比较器,它将按您的需要排序。

为了帮助创建这样的比较器函数,Ramda 还提供 ascenddescend,它们接受 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)).

已经涵盖了它