J'ai un tableau d'objets et je souhaite comparer ces objets sur une propriété d'objet spécifique. Voici mon tableau:
var myArray = [
{"ID": 1, "Cost": 200},
{"ID": 2, "Cost": 1000},
{"ID": 3, "Cost": 50},
{"ID": 4, "Cost": 500}
]
Je voudrais me concentrer sur le «coût» en particulier et obtenir une valeur minimale et maximale. Je me rends compte que je peux simplement saisir les valeurs de coût et les pousser dans un tableau javascript, puis exécuter Fast JavaScript Max / Min .
Cependant, y a-t-il un moyen plus simple de le faire en contournant l'étape de tableau au milieu et en supprimant directement les propriétés des objets (dans ce cas, "Coût")?
la source
lowest=highest=myArray[0]
, puis démarrer la boucle à 1.myArray[0].Cost
, cependant. Mais, s'il n'y a pas de premier élément, une erreur sera générée. Une vérification supplémentaire est donc nécessaire, annulant éventuellement la petite amélioration des performances.var lowestObject; for (...)
-à- dire etif (tmp < lowest) { lowestObject = myArray[i]; lowest = tmp; }
La réduction est bonne pour des choses comme celle-ci: pour effectuer des opérations d'agrégation (comme min, max, avg, etc.) sur un tableau d'objets et renvoyer un seul résultat:
... ou vous pouvez définir cette fonction interne avec la syntaxe de la fonction ES6:
Si vous voulez être mignon, vous pouvez attacher ceci au tableau:
Maintenant, vous pouvez simplement dire:
Veuillez noter que si vous avez l'intention de l'utiliser, il n'y a pas de contrôles complets pour chaque situation. Si vous passez un tableau de types primitifs, cela échouera. Si vous recherchez une propriété qui n'existe pas, ou si tous les objets ne contiennent pas cette propriété, vous obtiendrez le dernier élément. Cette version est un peu plus volumineuse, mais a ces vérifications:
la source
prev.Cost
indéfini? Ou est-ce qu'il commence à 0?Utilisez
sort
, si vous ne vous souciez pas du tableau en cours de modification.la source
myArray
, ce qui n'est peut-être pas prévu.O(nlog(n))
O(n)
Utilisez des
Math
fonctions et extrayez les valeurs souhaitéesmap
.Voici le jsbin:
https://jsbin.com/necosu/1/edit?js,console
METTRE À JOUR:
Si vous souhaitez utiliser ES6:
la source
apply
. Dites simplement -Math.min(...myArray.map(o => o.Cost))
pour trouver le minimum etMath.max(...myArray.map(o => o.Cost))
pour trouver le maximum.Je pense que la réponse de Rob W est vraiment la bonne (+1), mais juste pour le plaisir: si vous vouliez être "intelligent", vous pourriez faire quelque chose comme ceci:
ou si vous aviez une structure profondément imbriquée, vous pourriez devenir un peu plus fonctionnel et faire ce qui suit:
Ceux-ci pourraient facilement être curry dans des formes plus utiles / spécifiques.
la source
pour Max
pendant min
la source
Try (
a
est un tableau,f
est un champ à comparer)Afficher l'extrait de code
la source
En utilisant Array.prototype.reduce () , vous pouvez connecter des fonctions de comparaison pour déterminer l'élément min, max, etc. dans un tableau.
la source
Utilisation
Math.min
etMath.max
:la source
C'est une meilleure solution
la source
En ajoutant à la réponse de Tristan Reid (+ en utilisant es6), vous pouvez créer une fonction qui accepte un rappel, qui contiendra l'opérateur que vous souhaitez appliquer au
prev
etcurr
:Ensuite, vous pouvez simplement l'appeler en utilisant:
la source
Ceci peut être réalisé avec des lodash
minBy
et desmaxBy
fonctions.Lodash
minBy
etmaxBy
documentationSolution
la source
1, mode de script Java natif
2, triez d'abord l'objet, puis il est facile d'obtenir min max à partir d'obj trié
la source
Pour une solution concise et moderne, on peut effectuer une
reduce
opération sur le tableau, en gardant une trace des valeurs minimales et maximales actuelles, de sorte que le tableau ne soit itéré qu'une seule fois (ce qui est optimal).Démo:
Afficher l'extrait de code
la source
Un autre, similaire à la réponse de Kennebec, mais le tout sur une seule ligne:
la source
Vous pouvez utiliser l'objet Array intégré pour utiliser Math.max / Math.min à la place:
la source