2010-03-13 4 views
6

Il a été fait à la mort à peu près, ici sur SO et autour du Net. Cependant, je me demandais s'il y avait un moyen de tirer parti des fonctions standard min/max de:Min/Max à travers un tableau d'objets

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

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

Je peux donc effectuer des recherches sur un tableau d'objets de dire:

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

Actuellement, je dois boucle à travers le tableau et de comparer les valeurs d'objets manuellement et de façonner chacun d'eux au besoin particulier de la boucle. Un moyen plus général serait bien (si légèrement plus lent).

Répondre

6

Vous pouvez apporter quelques modifications à vos méthodes Array.min et max d'accepter un nom de propriété, extraire cette propriété de chaque objet dans le tableau, avec l'aide de Array.prototype.map, et la valeur maximale ou minimale de ces valeurs extraites:

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

Je veux juste mentionner que la méthode Array.prototype.map sera disponible sur presque tous les navigateurs modernes, et il fait partie de la ECMAScript 5th Edition Specification, mais Internet Explorer ne l'a pas, mais vous pouvez facilement inclure une mise en œuvre comme trouvé sur le Mozilla Developer Center.

+0

C'est une solution assez élégante. Je peux voir qu'il construit un nouveau tableau temporaire, donc je devrai probablement le mettre en cache, ou l'utiliser avec parcimonie. –

Questions connexes