Сортировка Ramda с учетом порядка и без учета регистра - PullRequest
0 голосов
/ 26 мая 2020

Я нахожусь в ситуации, когда мне нужно отсортировать массив объектов по убыванию или возрастанию, в то время как результат нечувствителен к регистру.

Я искал и нашел несколько функциональных способов сортировки по возрастанию / убыванию. Но мне нужна комбинация порядка + нечувствительности к регистру.

Вот мой объект массива.

const arr = [{ title: 'AAA' }, { title: 'BBB' }, { title: 'aaa' }];

Мне нужна каррированная функция, которая принимает конфигурацию сортировки и сортирует данный массив основан на этой конфигурации.

const ascending = sort({ by: 'title', order: 'asc' })(arr);
// output: [{ title: 'AAA' }, { title: 'aaa' }, { title: 'BBB' }]
const descending = sort({ by: 'title', order: 'desc' })(arr);
// output: [{ title: 'BBB' }, { title: 'aaa' }, { title: 'AAA' }]

Я уже реализовал версию моей функции сортировки. Однако я не могу сделать это без учета регистра.

const sortDirection = R.ifElse(
  R.equals('descending'), 
  R.always(R.descend), 
  R.always(R.ascend)
);
const sort = config => items => R.sortWith(
  [ 
    R.compose(
      sortDirection(config.order), 
      R.prop
    )(config.by) 
  ], 
  items
);

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Ответ на другой вопрос может быть легко адаптирован к этому:

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' в исходном порядке массива, но на ваших двух выходах они поменялись местами.)

0 голосов
/ 27 мая 2020

на основе ответа @Scott Sauyet, я немного изменил его, чтобы он выглядел так.

const makeSorter = (config) => sort(
  (config.order === 'desc' ? descend : ascend) (
    compose (
      ifElse(is(String), toLower, identity),
      prop(config.by)
    )
  )
);

Я просто хочу сделать это в нижнем регистре при работе со строкой.

...