我需要编写一个通用的排序函数。我正在使用jQuery进行排序。 jQuery sort函数只接受两个参数作为输入。但我想将另一个参数传递给该函数。我怎么能这样做?
这样的事情:
obj.sort(StringSort);
obj2.sort(StringSort);
function StringSort(a, b, desc)
{
var aText = $(a).attr(desc).toLowerCase();
var bText = $(b).attr(desc).toLowerCase();
if(aText == bText)
return 0;
return aText > bText ? 1 : -1;
}
答案 0 :(得分:12)
您可以创建一个返回函数的函数。外部函数接受附加参数,并使用返回的函数作为排序回调:
function getStringSort(desc) {
return function(a, b) {
// this is a closure, you can access desc here
// this function should contain your comparison logic or you just
// call StringSort here passing a, b and desc.
}
}
obj.sort(getStringSort(someValue));
内部函数可以访问外部函数的所有参数,因为它是closure [MDN]。
答案 1 :(得分:4)
我认为jQuery根本没有sort
功能。 JavaScript ,on arrays。 jQuery和JavaScript是不同的东西(一个是库,另一个是语言)。 更新 :啊,jQuery有一个未记录的sort
(它从Array.prototype
借用的几个函数之一),但事实并非如此记录,因此可以从点发布更改为点发布。谢谢,Felix。
您不能直接将第三个参数传递给函数。您可以将传递给sort
的函数调用另一个函数:
// ...assuming `desc` is in scope here here...
obj.sort(function(a, b) {
return StringSort(a, b, desc);
});
对于要比较的每对条目,相同的desc
将传递给StringSort
。当然,a
和b
在每次通话时都会有所不同。
这是有效的,因为我们传递给sort
的函数是对定义desc
的上下文的闭包。这意味着该函数可以访问desc
(就像函数可以访问全局变量一样,并且出于同样的原因)。
关于闭包的更多信息:
答案 2 :(得分:0)
试试这个:
function sortBy(field){
return function(a, b){
if (a.field > b.field)
return -1;
if (a.field < b.field)
return 1;
return 0;
};
}