如何自定义这个已经自定义的 jQuery 排序解决方案?

Posted

技术标签:

【中文标题】如何自定义这个已经自定义的 jQuery 排序解决方案?【英文标题】:How to customize this already custom jQuery sort solution? 【发布时间】:2010-10-27 14:19:24 【问题描述】:

我找到了以下解决方案来为 jQuery 添加排序功能(参考:jQuery sort())。我已经改变了对未知长度的字符串进行排序的解决方案。它工作得很好,但是正如您可能从函数名称中注意到的那样:它按升序排序:-)。

jQuery.fn.sort = function()   
    return this.pushStack( [].sort.apply( this, arguments ), []);  
;  

function sortStringAscending(a,b)
    var h1 = a.innerhtml;
    var h2 = b.innerHTML;
    var c = 0;
    var str1 = null,
    var str2 = null;

    while(str1 == str2 && (c < h1.length && c < h2.length)) 
        str1 = h1.substring(c,c+1).toLowerCase().charCodeAt(0);
        str2 = h2.substring(c,c+1).toLowerCase().charCodeAt(0);

        if(str1 > str2) 
            r = 1;
         else if(str2 > str1) 
            r = -1;
        

        c += 1;
    
    return r;  
;  

函数是这样使用的:

$('ol li').sort(sortStringAscending).appendTo('ol');

是否可以更改此代码以使以下成为可能?

$('ol li').sort(sortString, 0).appendTo('ol');  //0 for descending
$('ol li').sort(sortString, 1).appendTo('ol');  //1 for ascending

【问题讨论】:

【参考方案1】:

您将无法轻松地将附加参数添加到 jQuery.fn.sort 使用的数组排序函数中。

使用两个单独的函数会更容易,一个用于升序,一个用于降序,但将实际比较保留在第三个函数中。

function sortStringAscending(a,b) 
    return sortString(a,b,1);
;
function sortStringDescending(a,b) 
    return sortString(a,b,-1);
;
function sortString(a,b,direction) 
   var h1 = a.innerHTML.toLowerCase();
   var h2 = b.innerHTML.toLowerCase();

   if(h1 > h2) 
      r = 1*direction;
    else if(h2 > h1) 
      r = -1*direction;
   
   return r;  
;

另外请注意,您可以简单地比较两个字符串,无需逐个字符地比较它们,除非您希望对“abc”和“abcd”等项目具有不可预测的排序顺序。

那你应该可以了

$('ol li').sort(sortStringAscending).appendTo('ol');
$('ol li').sort(sortStringDescending).appendTo('ol');

【讨论】:

认为这是不可能的。无论如何,这将是我的解决方案;)【参考方案2】:

这将满足您的要求:(使用参数来决定排序顺序)

function sortString(a,b,direction)
var d = (direction?1:-1);
var h1 = a.html();
var h2 = b.html();
var c = 0;
var str1 = null,
var str2 = null;

while(str1 == str2 && (c < h1.length && c < h2.length)) 
    str1 = h1.substring(c,c+1).toLowerCase().charCodeAt(0);
    str2 = h2.substring(c,c+1).toLowerCase().charCodeAt(0);

    if(str1 > str2) 
        r = 1*d;
     else if(str2 > str1) 
        r = -1*d;
    

    c += 1;

return r;  

;

【讨论】:

不,这个不行,我自己试过这个。问题是我将函数委托(sortString)传递给排序方法: $('ol li').sort(sortString).appendTo('ol');向 sort() 方法添加参数,不会将这些参数添加到委托函数 sortString... altCognito, Array.prototype.sort() 接受一个参数,它预计是一个函数回调,然后将 2 个参数传递给该回调,它们是数组中的 curr/next 元素。因此,您不能只向回调添加第三个参数,因为无法实际传递它 Doh,是的,完全想念他是这样定义的。 (注意,它是被定义的) @duckyflip 我有点懒惰,但实际上,你可以重新定义排序函数,我现在不想把它拼出来,但是是的,我弄错了好吧。【参考方案3】:

改变这个:

if(str1 > str2) 
    r = 1;
 else if(str2 > str1) 
    r = -1;

到这里:

if(str1 > str2) 
    r = -1;
 else if(str2 > str1) 
    r = 1;

将交换排序顺序。


编辑:

由于 javascript 的 array.sort(callback) 函数的工作方式,仅添加第三个参数来接受回调并不容易,我建议使用 2 个单独的函数 mySortAsc 和 mySortDesc ,这又可以调用第三个函数并传递所需的任何参数。

【讨论】:

注意:他要传一个参数。 是的,我想传递一个参数 :-)【参考方案4】:

您也许可以使用闭包。虽然 javascript 数组排序方法需要一个 2 参数函数,但您可以通过执行以下操作将其他信息带入回调函数的范围:

function BiSort(direction)

    return  function( a, b )
            
                var d = ( direction ? 1 : -1 ) ;

                return ( a > b ? 1 : b > a ? -1 : 0 ) * d ; 
            

BiSort 函数返回一个可以访问外部函数参数列表的新函数。现在你可以这样做了:

var a = ["ant", "goat", "bat", "zebra", "yak"] ;

a.sort(BiSort(true));  // sorts ascending

a.sort(BiSort(false)); // sort descending

【讨论】:

【参考方案5】:

我知道这是旧的,但为了将来参考,我会为 asc/desc 创建 2 个函数,然后根据您的需要使 var 指向一个或另一个,然后将该 var 传递给 array.sort ()

function SortAsc(a, b)


function SortDesc(a, b)


var sortOrder

// if asc button clicked
sortOrder = SortAsc;

// if desc button clicked
sortOrder = SortDesc;



$('ol li').sort(sortOrder);

【讨论】:

以上是关于如何自定义这个已经自定义的 jQuery 排序解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 创建自定义排序条件

如何在javascript中定义自定义排序功能?

jquery-datatables 怎么自定义排序

Win10自定义资源管理器的具体步骤

jquery数据表,服务器端的自定义排序[关闭]

excel2013如何通过自定义排序方式来进行排序