Неожиданное поведение sortBy с Ramda

Применение 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 ], такой же, как ввод. Что я делаю неправильно?

Типы не совпадают. Из документации для функции sortBy требуется функция сортировки типа Ord b => a -> b. Однако функция R.ascend(R.identity) имеет тип a -> a -> Number. Просто используйте R.sortBy(R.identity) вместо этого.

Aadit M Shah 13.05.2019 04:35

Превосходно. Понятно. Спасибо.

bbarrington 13.05.2019 13:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
263
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отметил Аадит М Шах в комментариях, вы неправильно используете 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 должна заполнить.

Scott Sauyet 13.05.2019 13:24

Спасибо @ScottSauyet, это хороший отзыв. Я отредактирую свой ответ.

customcommander 13.05.2019 16:41

Другие вопросы по теме