Обратная сортировка при втором нажатии - Javascript - PullRequest
0 голосов
/ 15 апреля 2011

У меня есть функция, которая сортирует массив json после щелчка по ссылке (поэтому функция вызывается с помощью onclick), и функция работает и может сортировать:

function sortArch(a,b) {
x = eval("a." + sort_type).toLowerCase();  
y = eval("b." + sort_type).toLowerCase();  
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

Когда я нажимаю ту же кнопкуЯ хочу функцию обратной сортировки.Реверсирование достаточно простое:

x = eval("a." + sort_type).toLowerCase();  
y = eval("b." + sort_type).toLowerCase();  
return ((x < y) ? 1 : ((x > y) ? -1 : 0));

Моя проблема в том, что функция знает, как она должна сортироваться.Я думал об использовании логического флага, но я не могу придумать ничего, что работает.Я только ищу способ отслеживать, каким образом он сортируется, а затем, если кнопка нажата, она прибегает ко второму фрагменту кода.Спасибо заранее!

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

Вы можете сделать что-то вроде этого:

function mySort(desc) {
  var mod = desc ? -1 : 1;
  return function(a,b) {
    var lca = a[sort_type].toLowerCase(), 
        lcb = b[sort_type].toLowerCase();
    return lca > lcb ? 1 * mod : lca < lcb -1 * mod : 0;
  }
}

arr.sort(mySort(true)); //sort descending
arr.sort(mySort(false)); //sort ascending

Кстати: старайтесь не использовать eval, когда это не нужно, это медленно и грязно

1 голос
/ 15 апреля 2011

Вы почти закончили:

function compareFunc(sort_type, ascending) {
    var direction = ascending ? 1 : -1;
    return function(a, b) {
        x = a[sort_type].toLowerCase();
        y = b[sort_type].toLowerCase();

        return direction * x.localeCompare(y);
    }
}

Примеры использования:

persons = [
    {firstName: 'John', lastName: 'Foo'},
    {firstName: 'Bob', lastName: 'Bar'}
];


// In your button click events, use compareFunc to generate the right function :
persons.sort(compareFunc('firstName', true));
// or
persons.sort(compareFunc('firstName', false));
// or
persons.sort(compareFunc('lastName', true));
// or
persons.sort(compareFunc('lastName', false));

Ура!

0 голосов
/ 15 апреля 2011

Рекомендуется ваша идея использования логического флага:

function sort(reverse){
  if(reverse){
    //reverse sort code
  }else{
    //normal sort code
  }
}

bottonElement.onclick = function(){sort(true);}; //or use addEventHandler

Это также позволяет sort() cass, который автоматически выполняет нормальную сортировку, поскольку undefined является "ложным".

...