2013-02-13 54 views
3

我有一個非常簡單的一種排序方法:定製JavaScript數組的排序功能

sortByNumericAttr : function (a, b,attr){    
     a = a[attr]; 
     b = b[attr]; 
     return ((a < b) ? -1 : ((a > b) ? 1 : 0)); 
} 

這裏的想法是,我有不同的ATTR需要排序(ID,類型等)不同的對象,所以我思考而不是寫每個不同的排序功能(其中所有的差異只是排序的屬性),我會寫一個通用的方法,並將屬性傳遞給它。

所以,如果它是這樣寫的,我可以把它想:

arr.sort(utils.sortByNumericAttr,'typeId'); 

我怎樣才能做到這一點或類似的效果,在此基礎上功能?

+0

該代碼看起來不錯..... – 2013-02-13 08:11:11

+0

是的,沒有工作,JavaScript排序只接受函數,attr是undefined – Tomer 2013-02-13 08:11:18

+0

正如「這是可能的」一樣,問題通常不是對SO的知識體有益的補充。也沒有任何是/否的問題。他們中的大多數甚至可以通過快速查閱[相關文檔](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort)(您可以在其中看到正確的簽名方法等)。獲得正確實現功能的幫助是完全不同的事情。 – nbrooks 2013-02-13 08:16:58

回答

8

您可以創建一個功能與其他功能:

function sort_by(attr) { 
    return function(o1, o2) { 
     var a = o1[attr]; 
     var b = o2[attr]; 

     return ((a < b) ? -1 : ((a > b) ? 1 : 0)); 
    }; 
} 

然後調用它像.sort(sort_by('id'))

+0

+1天才!作品像一個魅力:) – Tomer 2013-02-13 08:16:07

0

如果你有一個這樣的名單:

var list = [ 
    {id:5, color:"Green", name:"Audi"}, 
    {id:1, color:"Red", name:"Ferrari"}, 
    {id:3, color:"Silver", name:"Mercedes"} 
]; 

您可以創建排序功能進行排序此列表爲每個使用的按鍵:

function sortById(a,b) { return (a.id-b.id); } 
list.sort(sortById); 

function sortByName(a,b) { return (a.name.localeCompare(b.name)); } 
list.sort(sortByName); 

function sortByColor(a,b) { return (a.color.localeCompare(b.color)); } 
list.sort(sortByColor); 
+0

該死的,我越來越慢^^ – Nippey 2013-02-13 08:22:55

+0

這個想法,正如我在我的問題中指出的,是寫一個通用函數而不是每個屬性的單獨函數 – Tomer 2013-02-13 08:29:43

+0

啊,對,我看到你意思。而且,當然是+1 Blender;) – Nippey 2013-02-13 12:34:11