Javascript 如何在Ramda中编写升序/降序排序
我有一个带有排序标题表的React组件。此代码按计划工作:Javascript 如何在Ramda中编写升序/降序排序,javascript,sorting,ramda.js,Javascript,Sorting,Ramda.js,我有一个带有排序标题表的React组件。此代码按计划工作: //definitions and imports... const [sort, setSort] = useState({column: 'rank', direction: 'ascending', isNumber: true}); const handleSort = (column, isNumber = false) => () => { let direction = (sort.col
//definitions and imports...
const [sort, setSort] = useState({column: 'rank', direction: 'ascending', isNumber: true});
const handleSort = (column, isNumber = false) => () => {
let direction = (sort.column !== column) ? 'ascending' : (sort.direction === 'ascending' ? 'descending' : 'ascending');
setSort({column, direction, isNumber});
};
const getSortedData = (data) => {
let sorted = R.sortBy(
R.compose(
sort.isNumber ? Number.parseFloat : R.toLower,
R.prop(sort.column)
),
data
);
return sort.direction === 'ascending' ? sorted : sorted.reverse();
}
//rest of the component...
但是,我确信有一种方法可以使用R.compose
有条件地ascend
或down
排序(基于sort.direction
属性),从而允许我删除getSortedData
的最后一行和reverse
数组op
我尝试了几种方法(比如用prop
组合ascend
,在组合中使用条件等),但都会破坏代码
虽然它现在很好用,但有人能帮我把它做得更像拉姆达吗
更新-为了子孙后代在此处添加解决方案:
const getSortedData = (data) => {
return R.sort(
(sort.direction === 'ascending' ? R.ascend : R.descend)(
R.compose(
sort.isNumber ? Number.parseFloat : R.toLower,
R.prop(sort.column)
)
)
)(data);
}
我学到的东西:
R.sort
返回函数,而不是数组,因此需要将数据作为参数发送到整个函数中
R.ascend
/R.descend
也期望该函数作为参数,因此不应单独作为R.compose
的参数converge
:
const arr=[{a:10,b'ZZZ'},{a:5,b'ccc'},{a:11,b'aaa'}];
const makeSort=converge(调用[
({dir})=>dir==='ascending'?上升:下降,
({isNumber,key})=>isNumber?组合(parseFloat,prop(key)):组合(toLower,prop(key)));
const ascSortB=makeSort({dir:'升序',isNumber:false,key:'b'});
const descSortA=makeSort({dir:'descending',isNumber:true,key:'a'});
日志(排序(ascSortB,arr));
console.log(排序(descSortA,arr))代码>
const{sort,ascend,down,prop,converge,call,compose,toLower}=R
我想我会这样做,把上升
或下降
环绕在构图上:
const makeSorter=(sortConfig)=>R.sort(
(sortConfig.direction===‘下降’?R.下降:R.上升)(R.compose)(
sortConfig.isNumber?Number.parseFloat:R.toLower,
R.prop(排序配置列)
))
)
康斯特人=[
{姓名:'fred',年龄:25},
{姓名:'barney',年龄:28},
{姓名:'wilma',年龄:29},
{姓名:'betty',年龄:22}
]
const byName={direction:'descending',column:'name',isNumber:false}
const getSortedData=makeSorter(按名称)
控制台日志(
getSortedData(人)
)
const byAge={direction:'singressing',column:'age',isNumber:true}
控制台日志(
makeSorter(按年龄)(人)
)
我知道我可以这样使用它-我正在尝试将其组合到现有函数中。您正在手动还原排序,而如果您使用上升
或下降
进行排序
(与排序相对)你不需要这样做,但我同意你的观点,试着组成你那一类的不同标准。将发布更新。关于sort
、sortBy
和sortWith
我真的不知道如何在Ramda文档中解决这些问题。是的!那正是我要找的!我用你的答案撰写了最终版本——为了子孙后代,我将把它贴在问题中。干杯,伙计!你的两个经验都有点不足。(1) sort
返回排序后的数组,但与所有Ramda函数一样,如果在第一次调用时没有提供数组,则会返回一个等待它的新函数。事实上,在本例中,您最好将)(数据)
替换为,data)
。(2) 上升
和下降
在组合
中很好,但传递给它们的值必须是返回某种有序类型元素的函数(一种可以通过进行合理比较的方法是,还需要注意的是,编写getSortedData
意味着每次使用主函数时都必须构建主函数。这里没有太多内容,所以可能没什么大不了的,但如果将它拉到一个单独的函数中,它可能是可重用的。@ScottSauyet I我来这里是想看看如何使用compose
-如果您有什么建议,我很高兴听到。我尝试将数据作为参数传递给排序,但遇到了某种错误-我将再次研究。最后,我理解您关于重建函数的说法-我将对其进行重构,使其能够谢谢,谢谢!