Как отсортировать в порядке убывания с помощью функции ramda sortBy? - PullRequest
0 голосов
/ 02 февраля 2020

При использовании функции Рамды sort я могу использовать функцию убывающий для создания нисходящего компаратора:

console.log(R.sort(R.descend(R.prop(0)))([[2],[3],[1]]))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>

С sortBy это не работает. По умолчанию список отсортирован в порядке возрастания.

R.sortBy(R.prop(0))([[2],[3],[1]])

Единственное решение, которое я могу придумать, - это явно перевернуть список после сортировки, но не существует более элегантного способа достичь этого?

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Рамда имеет несколько различных возможностей сортировки.

Наиболее знакомым является sort, который по сути является не мутантной версией чистой функции метода Array.prototype.sort. Вы передаете ему компаратор: двоичная функция, которая должна возвращать число. Если число отрицательное, первый аргумент опережает второй в результате; если он положительный, второй аргумент опережает первый; если оно равно нулю, у вас express нет предпочтений, хотя большинство реализаций в наши дни стабильны, что означает, что первый аргумент появится вперед.

sortWith - это способ объединения нескольких таких компараторов. Если вы хотите отсортировать по фамилии и - если они совпадают - по имени, вы можете передать компаратор фамилии и имя, и он будет сортироваться по вашему желанию.

Чтобы помочь создать такие функции компаратора, Ramda также предлагает ascend и descend, которые принимают функцию, которая возвращает упорядоченный тип, такой как встроенные типы String, Number и Date, или что-либо с соответствующим valueOf метод и возвращает компаратор, который можно передать в sort. Таким образом, если у каждого объекта, который вы хотите отсортировать, есть свойство numberri c age, вы можете отсортировать их, уменьшив возраст, передав descend(o => o.age) (эквивалентно descend(prop('age'))) в R.sort или Array.prototype.sort или - как один из множества компараторов - до R.sortWith.

Но достаточно часто нам хотелось бы чего-то попроще. Я просто хочу отсортировать их по коду типа . Для простейших случаев Рамда предлагает sortBy, который не использует компаратор, а просто функцию, которая возвращает что-то упорядоченного типа. Чаще всего это используется простым извлечением свойства из вашего объекта: sortBy(prop('type')), но вы можете делать любые преобразования, какие захотите.

Но нет эквивалента ascend / descend для sortBy , Хотя, конечно, что-то подобное можно написать, оно уже покрыто sort(a/descend(myFunc)).

0 голосов
/ 02 февраля 2020

Обновление:

Для sortBy необходимо инвертировать полученное значение, чтобы повлиять на направление сортировки. Это можно сделать с помощью небольшой функции desc:

const desc = a => -a;
const customSort = R.sortBy(R.compose(desc, R.prop(0)));

customSort([[1], [3], [2], [4]]);

// Result: [[4], [3], [2], [1]]

Рабочий пример: https://ramdajs.com/repl/?v=0.26.1#? Const% 20desc% 20% 3D% 20a% 20% 3D% 3E% 20-a % 3B% 0Aconst% 20customSort% 20% 3D% 20R.sortBy% 28R.compose% 28desc% 2C% 20R.prop% 280% 29% 29% 29% 3B% 0A% 0AcustomSort% 28% 5B% 5B1% 5D% 2C % 20% 5B3% 5D% 2C% 20% 5B2% 5D% 2C% 20% 5B4% 5D% 5D% 29% 3B

Предыдущий ответ с использованием sortWith:

sortWith даст вам желаемый результат.

const customSort = R.sortWith([R.descend(R.prop(0))]);

customSort([[1], [3], [2], [4]]);

// Result: [[4], [3], [2], [1]]

Рабочий пример: https://ramdajs.com/repl/?v=0.26.1#? Const% 20customSort% 20% 3D% 20R.sortWith% 28% 5BR.descend% 28R.prop% 280% 29% 29% 5D% 29% 3B% 0A% 0AcustomSort% 28% 5B% 5B1% 5D% 2C% 20% 5B3% 5D% 2C% 20% 5В2% 5D% 2C% 20% 5B4% 5D% 5D% 29% 3B

...