Как настроить это уже настраиваемое решение для сортировки jQuery? - PullRequest
1 голос
/ 20 мая 2009

Я нашел следующее решение для добавления возможностей сортировки в jQuery (ref: 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

Ответы [ 5 ]

3 голосов
/ 20 мая 2009

Вы не сможете легко получить дополнительный аргумент в функцию сортировки массива, которую использует 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');
0 голосов
/ 01 декабря 2012

Я знаю, что это старый, но для дальнейшего использования я бы сделал 2 функции для asc / desc, затем сделал бы указатель на одну или другую переменную на основе того, что вам нужно, и затем передал бы эту переменную в массив.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);
0 голосов
/ 05 августа 2009

Возможно, вы сможете использовать замыкание. Хотя метод сортировки массива javascript ожидает двухпараметрическую функцию, вы можете внести другую информацию в область функции обратного вызова, выполнив что-то вроде:

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
0 голосов
/ 20 мая 2009

Это будет делать то, что вы просили: (используйте параметр для определения порядка сортировки)

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;  

};

0 голосов
/ 20 мая 2009

Изменение этого:

if(str1 > str2) {
    r = 1;
} else if(str2 > str1) {
    r = -1;
}

к этому:

if(str1 > str2) {
    r = -1;
} else if(str2 > str1) {
    r = 1;
}

поменяет порядок сортировки.


РЕДАКТИРОВАТЬ:

Из-за того, как работает функция array.sort (callback) в Javascript, нелегко просто добавить третий параметр для принятия обратного вызова, я предлагаю использовать две отдельные функции mySortAsc и mySortDesc, которые, в свою очередь, могут вызывать третью функция и передача любых необходимых параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...