Javascript 如何定制这个已经定制的jQuery排序解决方案?
我找到了以下解决方案来向jQuery(ref:)添加排序功能。我改变了解决方案,对长度未知的字符串进行排序。但是,正如您可能从函数名中注意到的那样,它工作得很好:它对acscensding:-)进行排序 是否可以更改此代码,使以下内容成为可能?Javascript 如何定制这个已经定制的jQuery排序解决方案?,javascript,jquery,arrays,sorting,Javascript,Jquery,Arrays,Sorting,我找到了以下解决方案来向jQuery(ref:)添加排序功能。我改变了解决方案,对长度未知的字符串进行排序。但是,正如您可能从函数名中注意到的那样,它工作得很好:它对acscensding:-)进行排序 是否可以更改此代码,使以下内容成为可能? $('ol li').sort(sortString, 0).appendTo('ol'); //0 for descending $('ol li').sort(sortString, 1).appendTo('ol'); //1 for asce
$('ol li').sort(sortString, 0).appendTo('ol'); //0 for descending
$('ol li').sort(sortString, 1).appendTo('ol'); //1 for ascending
更改此选项:
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)函数的工作方式,仅为回调添加第三个参数来接受并不容易,我建议使用两个单独的函数mySortAsc和mySortDesc,这两个函数可以依次调用第三个函数并传递所需的任何参数。这将满足您的要求:(使用参数决定排序顺序)
函数排序字符串(a、b、方向){
变量d=(方向1:-1);
var h1=a.html();
var h2=b.html();
var c=0;
var str1=null,
var str2=null;
而(str1==str2&(cstr2){
r=1*d;
}否则如果(str2>str1){
r=-1*d;
}
c+=1;
}
返回r;
};在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');
您可能可以使用闭包。尽管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
我知道这很旧,但为了将来的参考,我会为asc/desc创建两个函数,然后根据需要将一个变量指向其中一个,然后将该变量传递给array.sort()
注意:他想传递一个参数。是的,我想传递一个参数:-)不,这不起作用,我自己试过这个。问题是我正在将函数委托(sortString)传递给sort方法:$('ol li').sort(sortString.appendTo('ol');将参数添加到sort()方法中,不会将这些参数添加到委托函数sortString…altCognito,Array.prototype.sort()中,它会将一个参数作为函数回调,然后将两个参数传递给该回调,即数组中的curr/next元素。因此,您不能只向回调中添加第三个参数,因为实际上无法传递它。哦,是的,完全没有注意到他是这样定义的。(注意,它是被定义的)@duckyflip我感觉有点懒,但是实际上,你可以重新定义排序函数,我现在不想把它拼出来,但是是的,我也把它弄错了。我认为这是不可能的。这就是我的解决方案;)
$('ol li').sort(sortStringAscending).appendTo('ol');
$('ol li').sort(sortStringDescending).appendTo('ol');
function BiSort(direction)
{
return function( a, b )
{
var d = ( direction ? 1 : -1 ) ;
return ( a > b ? 1 : b > a ? -1 : 0 ) * d ;
}
}
var a = ["ant", "goat", "bat", "zebra", "yak"] ;
a.sort(BiSort(true)); // sorts ascending
a.sort(BiSort(false)); // sort descending
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);