2011-09-18 138 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]; } 
}