Ответ на другой вопрос может быть легко адаптирован к этому:
const arr = [{ title: 'BBB' }, { title: 'AAA' }, { title: 'aaa' }]
const makeSorter = ({order, isNumber, by}) => sort (
(order === 'desc' ? descend : ascend) ( compose (
isNumber ? Number.parseFloat : toLower,
prop (by)
))
)
console .log (
makeSorter ({ by: 'title', order: 'asc' }) (arr)
) //~> [{ title: 'AAA' }, { title: 'aaa' }, { title: 'BBB' }]
console .log (
makeSorter ({ by: 'title', order: 'desc' }) (arr)
) //~> [{ title: 'BBB' }, { title: 'AAA' }, { title: 'aaa' }]
.as-console-wrapper {min-height: 100%; top: 0}
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script> const {sort, descend, ascend, compose, identity, toLower, prop } = R </script>
Если вы хотите включить свойство конфигурации для определения чувствительности, вы можете просто добавить его следующим образом:
const makeSorter = ({order, isNumber, by, insensitive}) => sort (
(order === 'desc' ? descend : ascend) ( compose (
isNumber ? Number.parseFloat : insensitive ? toLower : identity,
R.prop (by)
))
)
// later
makeSorter ({ by: 'title', order: 'asc', insensitive: true }) (arr)
//--------------------------------------------^
(Обратите внимание, что ни один из них на самом деле не захватит ваш ожидаемый результат точно, если даны заголовки 'aaa', 'AAA' и 'BBB' в любом порядке, поскольку современные сортировки стабильны, они будут сортировать 'aaa' и 'AAA' в исходном порядке массива, но на ваших двух выходах они поменялись местами.)