应用'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],与输入相同。我究竟做错了什么?
答案 0 :(得分:2)
如Aadit M Shah在评论中所指出的,您没有正确使用sortBy
。
以下是有关如何在Ramda中进行排序的快速概述:
返回列表的副本,该副本根据比较器功能排序,一次应接受两个值,如果第一个值较小,则返回负数,如果较大则返回正数,如果相等则返回零
一种情况下,使用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"]
如我们所见,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([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"}
//=> ]