【发布时间】:2019-06-06 01:05:12
【问题描述】:
我有一个带有排序标题表的 React 组件。此代码按计划工作:
//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 或descend 进行排序(基于sort.direction 属性),从而允许我删除@987654326 的最后一行@ 和 reverse 数组操作。
我尝试了几件事(例如将ascend 与prop 组合在一起,使用组合中的条件等),但这一切都破坏了代码。
虽然它现在运行良好,但谁能帮我把它做得更好Ramdaish?
更新 - 为了后代的缘故,在此处添加解决方案:
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返回一个函数,而不是数组,因此您需要将data作为参数发送给整个函数。 -
R.ascend/R.descend也期望该函数作为参数,因此不应单独作为R.compose的参数。
【问题讨论】:
-
你的两个学习都有些偏离。 (1)
sort返回排序后的数组,但就像所有 Ramda 函数都是柯里化的,所以如果你在第一次调用时没有提供数组,你会得到一个等待它的新函数。事实上,在本例中,将)(data)替换为, data)会稍微好一些。 (2)ascend和descend在compose中很好,但传递给它们的值必须是返回某种有序类型元素的函数(可以通过<合理地比较)。可以使用嵌套的compose函数轻松编写。 -
另请注意,写
getSortedData意味着每次使用时都必须构建主函数。那里没有太多事情发生,所以它可能不是什么大问题,但如果你把它拉到一个单独的函数中,它可能是可重用的。 -
@ScottSauyet 实际上我来这里是想看看如何使用
compose来组合它——如果你有建议,我很高兴听到。我尝试将data作为参数传递给排序,但出现了某种错误——我会再调查一次。最后,我理解你所说的关于重建函数的内容——我将对其进行重构,以便它可以被重用。谢谢!
标签: javascript sorting ramda.js