2011-09-18 139 views
4

对于类似的问题,SO上有很多答案,它们都描述了如何实现自定义排序函数来排序javascript对象数组。如何根据属性排序javascript对象,指定属性

但是,我想知道是否可以实现一个更抽象的自定义排序,这将允许我传递我想要排序的对象的属性的名称。这可能使我不得不一次又一次地实现非常相似的功能。

所以,如果我有喜欢的对象构造:

function Car(mph, cc) { 
    this.maxSpeed = mph; 
    this.engineSize = cc; 
} 

然后代替执行两种类型的功能:

function sortCarsOnMaxSpeed(a, b) { return a.maxSpeed - b.maxSpeed; } 
function sortCarsOnEngineSize(a, b) { return a.engineSize - b.engineSize; } 

我可能有某种通用的功能,如:

function sortObjectsOnProperty(a, b, property) { 
    return a[property] - b[property]; 
} 

但自定义排序似乎只有2个参数。

有关我如何做到这一点的任何建议?

非常感谢。

回答

8

你需要写一个函数,属性名称,并返回一个比较:

function createComparator(property) { 
    return function(a, b) { 
     return a[property] - b[property]; 
    }; 
} 

你会使用这样的:

arr.sort(createComparator("maxSpeed")); 
+0

这很好,谢谢。 – Joe

+0

功能createComparator(属性){ 返回功能(A,B){ 如果(一个[属性]> B [属性])返回1 如果(一个[属性]的 partizanos

2

sort需要一个功能,它可以是匿名的:

sort(array, function(a, b) { return a.maxSpeed - b.maxSpeed; }); 

如果你真的不想这样,你可以定义一个sortObjectsO nProperty()函数返回排序回调像这样:

function sortObjectsOnProperty(name) { 
    return function(a, b) { return a[name] - b[name]; } 
}