Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何定制这个已经定制的jQuery排序解决方案?_Javascript_Jquery_Arrays_Sorting - Fatal编程技术网

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

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

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

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

$('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);