Javascript 如何在Ramda中编写升序/降序排序

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

我有一个带有排序标题表的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
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
    -如果您有什么建议,我很高兴听到。我尝试将
    数据作为参数传递给排序,但遇到了某种错误-我将再次研究。最后,我理解您关于重建函数的说法-我将对其进行重构,使其能够谢谢,谢谢!