5

我需要编写一个通用的排序函数。我正在使用 jQuery 进行排序。jQuery 排序函数只接受两个参数作为输入。但我想将另一个参数传递给该函数。我怎样才能做到这一点?

像这样的东西:

 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;
 }
4

3 回答 3

13

您可以创建一个返回函数的函数。外部函数接受附加参数,并将返回的函数用作排序回调:

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

内部函数可以访问外部函数的所有参数,因为它是一个闭包[MDN]

于 2012-10-22T10:30:07.203 回答
4

我不相信 jQuery 有一个sort功能。JavaScript确实如此,在数组上。jQuery 和 JavaScript 是不同的东西(一个是库,另一个是语言)。更新:啊,jQuery 有一个未记录的sort(它借用的几个函数之一Array.prototype),但该事实没有记录,因此可能会从 dot release 更改为 dot release。谢谢,菲利克斯

您不能将第三个参数直接传递给函数。你可以让你传入的函数sort调用另一个函数:

// ...assuming `desc` is in scope here here...
obj.sort(function(a, b) {
    return StringSort(a, b, desc);
});

对于被比较的每对条目,相同的desc内容将被传递给。当然,每次通话都会有所不同。StringSortab

这是有效的,因为我们传入的函数sort是对定义的上下文的闭包desc。这意味着函数可以访问desc(就像函数可以访问全局变量一样,出于同样的原因)。

更多关于闭包:

于 2012-10-22T10:29:28.963 回答
0

试试这个:

function sortBy(field){
    return function(a, b){
        if (a.field > b.field)
            return -1;
        if (a.field < b.field)
            return 1;
        return 0;
    };
}
于 2014-05-12T03:06:53.607 回答