我找到了以下解决方案来为jQuery添加排序功能(参考:jQuery sort())。我已经改变了解决方案来排序未知长度的字符串。它可以很好地工作,但正如您可能从函数名称中注意到的那样:它对accecending进行排序: - )。
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
答案 0 :(得分:3)
您无法轻松地在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');
答案 1 :(得分:0)
更改此内容:
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(回调)函数的工作方式不容易为回调添加第三个参数接受,我建议使用2个独立的函数mySortAsc和mySortDesc,这反过来又可以调用第三个函数和传递所需的任何参数。
答案 2 :(得分:0)
这将执行您的要求:(使用参数来确定排序顺序)
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;
};
答案 3 :(得分:0)
您可以使用闭包。虽然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
答案 4 :(得分:0)
我知道这是旧的,但是为了将来的参考,我会为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);