Применение sortBy дает неожиданные результаты.
Я должен делать что-то глупое. Это такая базовая операция.
const input = [4,3,2,1];
const sort = list => R.sortBy(R.ascend(R.identity))(list);
console.info(sort(input)); // [ 4, 3, 2, 1 ]
Я бы ожидал, что вывод вызова console.info будет [ 1, 2, 3, 4 ], но это не так: вывод [ 4, 3, 2, 1 ], такой же, как ввод. Что я делаю неправильно?
Превосходно. Понятно. Спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Как отметил Аадит М Шах в комментариях, вы неправильно используете sortBy.
Вот краткий обзор того, как сортировать в Ramda:
Returns a copy of the list, sorted according to the comparator function, which should accept two values at a time and return a negative number if the first value is smaller, a positive number if it's larger, and zero if they are equal.
В одном случае используйте 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) может быть полезен:
Makes an ascending comparator function out of a function that returns a value that can be compared with < and >.
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"}
//=> ]
Хороший! Лучшим примером sortBy может быть sortBy(prop('age')). Комментарий к ним: sort использует компаратор, как и Array.prototype.sort. sortWith принимает массив компараторов, возвращая первое ненулевое значение, а sortByсоздает — компаратор из функции, которая возвращает тип, который можно сравнить с <, и использует этот компаратор. ... Вы правы, у sortBy нет версии нисходящий. Возможно, это пробел, который Ramda должна заполнить.
Спасибо @ScottSauyet, это хороший отзыв. Я отредактирую свой ответ.
Типы не совпадают. Из документации для функции
sortByтребуется функция сортировки типаOrd b => a -> b. Однако функцияR.ascend(R.identity)имеет типa -> a -> Number. Просто используйтеR.sortBy(R.identity)вместо этого.