第二次点击反向排序 - Javascript

时间:2011-04-15 12:48:57

标签: javascript json sorting click reverse

我有一个函数可以在单击链接后对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 个答案:

答案 0 :(得分:3)

你可以这样做:

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

btw:尽量不要使用eval,它很慢而且很乱

答案 1 :(得分:1)

你差不多完成了:

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));

干杯!

答案 2 :(得分:0)

建议您使用布尔标志:

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

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

这也允许sort() cass,由于undefined是“假的”,它会自动进行正常排序。