如何用Ramda根据变量实现用户列表的升序/降序排序?
按sortOrder切换Ramda排序的升序/降序方案
没问题,这个需求很好实现!你只需要根据sortOrder的取值,动态选择Ramda的ascend或者descend排序器就可以了,直接看修改后的代码:
const getUserList = createSelector( getUsers, getSortBy, getSortOrder, (users, sortBy, sortOrder) => R.sortWith([ // 根据sortOrder动态切换升序/降序 sortOrder === 'asc' ? R.ascend(R.prop(sortBy)) : R.descend(R.prop(sortBy)) ])(users), );
简单解释:
- 原代码里固定使用了
R.ascend(升序),现在我们通过一个三元表达式判断sortOrder:- 当
sortOrder为'asc'时,使用R.ascend(R.prop(sortBy))按指定属性升序排序 - 当
sortOrder为'desc'时,切换为R.descend(R.prop(sortBy))按指定属性降序排序
- 当
更健壮的版本(处理异常值):
如果担心sortOrder可能出现非预期的取值,可以把默认行为设为升序,这样更稳妥:
const getUserList = createSelector( getUsers, getSortBy, getSortOrder, (users, sortBy, sortOrder) => R.sortWith([ sortOrder === 'desc' ? R.descend(R.prop(sortBy)) : R.ascend(R.prop(sortBy)) ])(users), );
更Ramda风格的写法(可选):
如果你想全程用Ramda的函数式风格,可以用R.ifElse来替代三元表达式:
const getUserList = createSelector( getUsers, getSortBy, getSortOrder, (users, sortBy, sortOrder) => { const sortComparator = R.ifElse( R.equals('asc'), () => R.ascend(R.prop(sortBy)), () => R.descend(R.prop(sortBy)) )(sortOrder); return R.sortWith([sortComparator])(users); }, );
这几种写法都能满足你的需求,其中第一种三元表达式的写法最简洁直观,推荐日常使用~
内容的提问来源于stack exchange,提问作者corvid
相关产品推荐
相关产品推荐

