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));
我喜欢第二个相反的建议:)