Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用'apply'更改排序函数_Javascript_Apply - Fatal编程技术网

Javascript 使用'apply'更改排序函数

Javascript 使用'apply'更改排序函数,javascript,apply,Javascript,Apply,我有一个排序函数,我们把它叫做mySort(a,b),如果a较小,它返回1,0,-1。等于,大于b。这样,我就可以使用myArray.sort(mySort)对数组进行排序 现在我有了一个视图,其中数组需要按降序排序。我的第一个解决方案是只执行myArray.sort(mySort.reverse()(是的,我知道这不是很有效,但数组包含的项不到50项)。但我开始想,也许我可以在排序函数中添加另一个参数,如果设置为false:mySort(a,b,升序=true),则返回相反的结果 问题是:如果

我有一个排序函数,我们把它叫做
mySort(a,b)
,如果a较小,它返回1,0,-1。等于,大于b。这样,我就可以使用
myArray.sort(mySort)
对数组进行排序

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


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

这是另一种解决方案,但我只想将排序函数包装到另一个函数中

function myRevSort(a, b) {
   return mySort(a, b) * -1;
}
或者,如果您想要一个布尔标志(尽管通常不建议这样做),您可以使用它来选择乘数,然后返回一个“sorter”函数:

function newSorter(ascending = true) {
   var mult = ascending ? 1 : -1;

   return function(a, b) {
       return mySort(a, b) * mult;
   } 
}
然后像这样使用它:

myArray.sort(newSorter(false));
不过需要注意的是,我认为“comparator”是这些函数更合适的名称
sort
听起来像是对集合进行实际排序的函数。

您可以使用它来绑定上下文和初始参数,但我不认为有任何类似的东西会在不使用前两个参数的情况下强制后面的参数

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

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));

我喜欢第二个相反的建议:)