如何自定义这个已经自定义的 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 排序解决方案?的主要内容,如果未能解决你的问题,请参考以下文章