2013-02-13 53 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