Неожиданное поведение sortBy с Рамдой - PullRequest
0 голосов
/ 13 мая 2019

Применение метода 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 Ответ

2 голосов
/ 13 мая 2019

Как указывает Аадит М Шах в комментариях, вы не используете sortBy правильно.

Вот краткий обзор того, как сортировать в Ramda:

рода

Возвращает копию списка, отсортированного в соответствии с функцией сравнения, которая должна принимать два значения за раз и возвращать отрицательное число, если первое значение меньше, положительное число, если оно больше, и ноль, если они равны. .

В одном случае используйте subtract для сортировки в порядке возрастания:

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

Или для сортировки по убыванию, просто flip it:

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 ожидает, что вы предоставите ему функцию, которая принимает два параметра, которые можно сравнивать друг с другом, используя < или >. Числа и строки можно сравнить с этими операторами, поэтому, если вы можете передать их Рамде напрямую, тогда:

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"}
//=> ]
...