2011-04-15 51 views
0

我已經被點擊後鏈接(這樣的功能是使用一個onclick調用)和功能的工作原理和可排序的排序JSON數組功能:反向排序在第二次點擊 - 使用Javascript

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

我的問題是有功能知道它需要排序方式。我正在考慮使用布爾標誌,但我似乎無法想出任何可行的方法。我只是在尋找一種方法來跟蹤它被排序的方式,然後如果按鈕被點擊,它會使用第二個代碼片斷來進行處理。 感謝先進!

+0

您可以詳細瞭解何時發生排序的時間與點擊按鈕的時間有關嗎? – 2011-04-15 12:53:16

+0

爲什麼使用'eval()'?什麼是'a','b'和'sort_type'? – 2011-04-15 12:54:32

+4

首先,你需要用'a [sort_type]'替換'eval(「a。」+ sort_type)'(與'b'相同) – ThiefMaster 2011-04-15 12:55:21

回答

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,當你沒有,它是緩慢而凌亂

0

你使用布爾標誌的想法建議:

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

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

這也讓sort()卡斯,它會自動做一個正常的排序,因爲undefined是「falsy」。

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

乾杯!