Ramda发生意外的“ sortBy”行为

时间:2019-05-13 02:12:43

标签: javascript sorting functional-programming ramda.js

应用'sortBy'会产生意外结果。

我必须做些愚蠢的事情。这是基本操作。

const input = [4,3,2,1];

const sort = list => R.sortBy(R.ascend(R.identity))(list);

console.log(sort(input)); // [ 4, 3, 2, 1 ]

我希望'console.log'调用的输出为[1,2,3,4],但不是:输出为[4,3,2,1],与输入相同。我究竟做错了什么?

1 个答案:

答案 0 :(得分:2)

如Aadit M Shah在评论中所指出的,您没有正确使用sortBy

以下是有关如何在Ramda中进行排序的快速概述:

sort

  

返回列表的副本,该副本根据比较器功能排序,一次应接受两个值,如果第一个值较小,则返回负数,如果较大则返回正数,如果相等则返回零

一种情况下,使用subtract以升序排序:

sort(subtract, [4, 1, 2, 3]);
//=> [1, 2, 3, 4]

或者以降序排列,只需flip

sort(flip(subtract), [4, 1, 2, 3]);
//=> [4, 3, 2, 1]

sort只是期望一个可以接受两个参数的函数,这些参数可以与<>进行比较。

那么您将如何对字符串数组进行排序?可以将字符串与<>进行比较,但使用subtract则没有意义。这是ascend(或descend)有用的地方:

  

使返回值可以与<和>进行比较的函数中的升序比较器函数。

sort(ascend(identity), ["b", "a", "B", "A"]);
//=> ["A", "B", "a", "b"]

如果要进行不区分大小写的比较:

sort(ascend(toLower), ["b", "a", "B", "A"]);
//=> ["a", "A", "b", "B"]

sortBy

如我们所见,sort希望为它提供一个函数,该函数接受两个可以使用<>进行比较的参数。可以将数字和字符串与这些运算符进行比较,因此,如果可以直接将它们提供给Ramda,则:

sortBy(identity, [4, 1, 2, 3]);
//=> [1, 2, 3, 4]

与以下相同:

sort(subtract, [4, 1, 2, 3]);
//=> [1, 2, 3, 4]

据我所知,sortBy始终会按升序对事物进行排序。

sortWith

当您有多个排序条件时,可以使用sortWith

  • 按年龄升序排列
  • 按名称降序排列
sortWith([ascend(prop('age')), descend(prop('name'))], [
  {age: 40, name: 'John'},
  {age: 40, name: 'Zack'},
  {age: 10, name: 'Liam'},
  {age: 20, name: 'Bill'}
]);
//=> [
//=>   {age: 10, name: "Liam"},
//=>   {age: 20, name: "Bill"},
//=>   {age: 40, name: "Zack"},
//=>   {age: 40, name: "John"}
//=> ]