【问题标题】:Using `apply` to change a sort function使用 `apply` 更改排序功能
【发布时间】:2018-08-09 20:00:48
【问题描述】:

我有一个排序函数,我们称它为mySort(a, b),如果 a 更小,则返回 1,0,-1。相等,大于 b。这样,我可以使用myArray.sort(mySort) 对我的数组进行排序。

我现在有一个视图,其中数组需要按降序排序。我的第一个解决方案是只做myArray.sort(mySort).reverse()(是的,我知道它效率不高,但数组包含少于 50 个项目)。但我开始想,也许我可以在我的排序函数中添加另一个参数,如果设置为false,则会返回相反的结果:mySort(a, b, ascending = true)

问题是:如果我想使用Array.sort,我需要提供一个函数。有没有办法使用apply(或call?)创建一个将ascending设置为false的函数,以允许myArray.sort(myFunction.apply(null, [,,false]))之类的方式?因为我看不到动态提供 a 和 b 的方法。

【问题讨论】:

    标签: javascript apply


    【解决方案1】:

    您可以使用mySort.bind() 来绑定上下文和初始参数,但我认为不会有类似的东西会强制后面的参数,同时保留前两个参数。

    您可以使用添加参数的包装函数:

    myArray.sort((a, b) => mySort(a, b, true));
    

    或反转结果的符号:

    myArray.sort((a, b) => -mySort(a, b));
    

    或交换参数顺序:

    myArray.sort((a, b) => mySort(b, a));
    

    您还可以创建一个实现此功能的高阶函数。

    function reverseArgs(func) {
        return function() {
            return func.apply(this, Array.from(arguments).reverse());
        };
    }
    
    myArray.sort(reverseArgs(mySort));
    

    【讨论】:

    • 我喜欢第二个反向建议:)
    【解决方案2】:

    这是一个替代解决方案,但我只是将您的排序函数包装在另一个函数中。

    function myRevSort(a, b) {
       return mySort(a, b) * -1;
    }
    

    或者,如果您想要一个布尔标志(尽管通常不建议这样做),您可以使用它来选择乘数,然后返回一个“排序器”函数:

    function newSorter(ascending = true) {
       var mult = ascending ? 1 : -1;
    
       return function(a, b) {
           return mySort(a, b) * mult;
       } 
    }
    

    然后像这样使用它:

    myArray.sort(newSorter(false));
    

    请注意,我认为“比较器”是这些函数更合适的名称。 sort 听起来像是实际对集合进行排序的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      相关资源
      最近更新 更多