2010-03-13 105 views
6

在SO和「Net」周圍,已經完成了很多死亡事件。不過,我想知道是否有利用標準分的方法/的最大功能:對象陣列的最小值/最大值

Array.max = function(array) { 
    return Math.max.apply(Math, array); 
}; 

Array.min = function(array) { 
    return Math.min.apply(Math, array); 
}; 

所以我可以在說的對象的數組搜索:

function Vector(x, y, z) { this.x = x; this.y = y; this.z = z; } 
var ArrayVector = [ /* lots of data */ ]; 
var min_x = ArrayVector.x.min(); // or 
var max_y = ArrayVector["y"].max(); 

目前我有循環通過數組並手動比較對象值並將每個對象設置爲循環的特定需要。更通用的方式會更好(如果稍慢)。

回答

6

你可以做一些更改Array.minmax方法接受一個屬性名稱,提取每個對象的該屬性的陣列中,與Array.prototype.map的幫助下,最大或最小值的提取值:

Array.maxProp = function (array, prop) { 
    var values = array.map(function (el) { 
    return el[prop]; 
    }); 
    return Math.max.apply(Math, values); 
}; 

var max_x = Array.maxProp(ArrayVector, 'x'); 

我只是想提及的是,Array.prototype.map方法將可以在幾乎所有的現代瀏覽器,而且它是ECMAScript 5th Edition Specification的一部分,但Internet Explorer不擁有它,但是你可以很容易地包括像找到了一個實現在Mozilla Developer Center

+0

這是一個相當優雅的解決方案。我可以看到它構造了一個新的臨時數組,所以我可能不得不緩存它,或者謹慎使用它。 – 2010-03-14 11:19:41