2010-03-13 14 views
6

Es wurde ziemlich viel zu Tode getan, hier auf SO und um das Netz herum. Ich frage mich jedoch, ob es einen Weg, die Standard-Min-/Max-Funktionen zu nutzen:Min/Max über ein Array von Objekten

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(); 

Zur Zeit muss ich Schleife:

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

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

So kann ich über ein Array von Objekten von sagen wir suchen durch das Array und vergleichen Sie die Objektwerte manuell und fertigen Sie jedes an die besonderen Bedürfnisse der Schleife. Ein allgemeinerer Weg wäre schön (wenn auch etwas langsamer).

Antwort

6

Sie könnten einige Änderungen an Ihrem Array.min und max Methoden machen einen Eigenschaftsnamen zu akzeptieren, extrahieren, die Eigenschaft jedes Objekts in dem Array, mit Hilfe von Array.prototype.map, und die max oder min Wert dieser extrahierten Werte:

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'); 

ich möchte nur erwähnen, dass die Array.prototype.map Methode auf fast allen modernen Browsern verfügbar sein wird, und es ist ein Teil des ECMAScript 5th Edition Specification, aber Internet Explorer es nicht hat, aber können Sie gehören einfach eine Implementierung wie die gefunden auf der Mozilla Developer Center.

+0

Das ist eine ziemlich elegante Lösung. Ich kann sehen, dass es ein neues temporäres Array erstellt, so dass ich es wahrscheinlich zwischenspeichern muss, oder es sparsam verwenden muss. –