Ramda排序,不区分大小写

问题描述 投票:0回答:2

我处于一种情况,我需要对对象降序或升序排列,而结果不区分大小写。

我进行了搜索,找到了一些升序/降序排序的功能方法。但是我需要的是顺序+不区分大小写的组合。

这是我的数组对象。

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
);

javascript functional-programming ramda.js
2个回答
2
投票

answer from another question可以很容易地适应此:

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
投票

基于@Scott Sauyet的答案,我对其进行了一些更改,因此看起来像这样。

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

我只想在处理字符串时使其小写。

© www.soinside.com 2019 - 2024. All rights reserved.