【问题标题】:How to customize this already custom jQuery sort solution?如何自定义这个已经自定义的 jQuery 排序解决方案?
【发布时间】: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

【问题讨论】:

    标签: javascript jquery arrays sorting


    【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 2012-09-26
        • 2010-12-07
        • 1970-01-01
        • 2017-12-26
        • 1970-01-01
        • 2012-02-15
        相关资源
        最近更新 更多