2010-03-13 10 views
6

Se ha hecho casi hasta la muerte, aquí en SO y alrededor de la 'Red. Sin embargo, me preguntaba si había una manera de aprovechar el mínimo estándar/funciones máximo de:Mín./Máx. A través de una matriz de objetos

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

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

Así que pueden buscar a través de una matriz de objetos de, por ejemplo:

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

Actualmente tengo un bucle a través de la matriz y comparar los valores del objeto manualmente y crear cada uno a la necesidad particular del ciclo. Una forma más general sería agradable (aunque un poco más lenta).

Respuesta

6

Se podría hacer algunos cambios a sus Array.min y max métodos para aceptar un nombre de propiedad, extraer que la propiedad de cada objeto de la matriz, con la ayuda de Array.prototype.map, y el valor máximo o mínimo de los valores extraídos:

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

sólo quiero mencionar que el método Array.prototype.map estará disponible en casi todos los navegadores modernos, y es parte de la ECMAScript 5th Edition Specification, pero Internet Explorer no lo tiene, sin embargo se puede incluir fácilmente una aplicación como el encontrado en el Mozilla Developer Center.

+0

Es una solución bastante elegante. Puedo ver que construye una nueva matriz temporal, así que probablemente tendré que guardarla en caché o usarla con moderación. –

Cuestiones relacionadas