在这种情况下,我需要对对象的降序或升序进行排序,而结果不区分大小写。
我进行了搜索,找到了一些升序/降序排序的功能方法。但是我需要的是顺序+不区分大小写的组合。
这是我的数组对象。
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
);
答案 0 :(得分: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”,但您的两个输出已互换。)
答案 1 :(得分:0)
基于@Scott Sauyet的答案,我对其进行了一些更改,使其看起来像这样。
const makeSorter = (config) => sort(
(config.order === 'desc' ? descend : ascend) (
compose (
ifElse(is(String), toLower, identity),
prop(config.by)
)
)
);
我只想在处理字符串时使其小写。