Jquery将额外变量传递给sort函数

时间:2012-10-22 10:27:11

标签: javascript jquery

我需要编写一个通用的排序函数。我正在使用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;
 }

3 个答案:

答案 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。当然,ab在每次通话时都会有所不同。

这是有效的,因为我们传递给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;
    };
}