【问题标题】:How to sort in descending order with ramda's sortBy function?如何使用 ramda 的 sortBy 函数进行降序排序?
【发布时间】:2020-02-03 04:52:09
【问题描述】:

当使用 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]])

我能想到的唯一解决方案是在排序后显式反转列表,但是没有更优雅的方法来实现吗?

【问题讨论】:

  • 实现什么的更优雅的方式?您已经展示了创建降序排序器的合理方法:sort(descend(prop(0))。您是否建议使用sortBysort 可以实现这一点?您认为缺少什么?
  • 我只是想在这里也可以使用descend函数。在查找 sortBy 的实现之后,它为什么不起作用是有道理的。

标签: javascript sorting ramda.js


【解决方案1】:

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

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

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

为了帮助创建此类比较器函数,Ramda 还提供了 ascenddescend,它们接受返回有序类型的函数,例如内置的字符串、数字和日期类型,或任何带有适当 @ 的类型987654326@ 方法,并返回一个可以传递给sort 的比较器。因此,如果您要排序的每个对象都有一个数字 age 属性,您可以通过将 descend(o => o.age) (等效地,descend(prop('age')))传递给 R.sortArray.prototype.sort 或 -- 作为其中之一,通过递减年龄对它们进行排序比较器数组——R.sortWith

但我们经常想要更简单的东西。 我只想按它们的类型代码对它们进行排序。对于最简单的情况,Ramda 提供了sortBy,它不接受比较器,而只是一个返回有序类型的函数。最常见的是通过简单地从对象中提取属性来使用:sortBy(prop('type')),但您可以进行任何您喜欢的转换。

但是对于sortBy,没有等价于ascend/descend。虽然当然可以编写类似的内容,但 sort(a/descend(myFunc)) 已经涵盖了它。

【讨论】:

  • 为什么在 sortBy 之后不使用reverse()
  • @YannickSchuchmann:你当然可以。通常有多种方法可以完成这些事情。
【解决方案2】:

更新:

对于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

【讨论】:

  • sortBy好在哪里?
  • 谢谢。我猜R.sortBy(R.compose(R.negate, R.prop(0))); 也可以。
  • 但请注意,sortBy 适用于任何有序类型,而不仅仅是数字。你不能否定一个字符串。 (我没有尝试过使用正确的 valueOf 的日期或对象;乘法的强制可能只是让它起作用;但我不想指望它。)
猜你喜欢
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
相关资源
最近更新 更多