J'ai un simple objet JavaScript Array contenant quelques chiffres.
[267, 306, 108]
Y a-t-il une fonction qui trouverait le plus grand nombre dans ce tableau?
javascript
algorithm
arrays
max
dingue
la source
la source
Math.max(...[267, 306, 108]);
Réponses:
Resig à la rescousse:
avertissement : puisque le nombre maximum d'arguments est aussi bas que 65535 sur certaines machines virtuelles , utilisez une boucle for si vous n'êtes pas certain que le tableau est si petit.
la source
apply
appel peut le nettoyer très facilement.RangeError: Maximum call stack size exceeded.
Vous pouvez utiliser la fonction apply, pour appeler Math.max :
Comment ça fonctionne?
La demande fonction est utilisée pour appeler une autre fonction, avec un contexte et des arguments donnés, fournis sous forme de tableau. Les fonctions min et max peuvent prendre un nombre arbitraire d'arguments d'entrée: Math.max (val1, val2, ..., valN)
Donc, si nous appelons:
La fonction d'application exécutera:
Notez que le premier paramètre, le contexte, n'est pas important pour ces fonctions car elles sont statiques, elles fonctionneront indépendamment de ce qui est passé en tant que contexte.
la source
La syntaxe la plus simple, avec le nouvel opérateur d'étalement :
Source: Mozilla MDN
la source
Je ne suis pas un expert JS, mais je voulais voir comment ces méthodes s'empilent, donc c'était une bonne pratique pour moi. Je ne sais pas si c'est techniquement la bonne façon de tester ces performances, mais je les ai juste exécutées l'une après l'autre, comme vous pouvez le voir dans mon code.
Le tri et l'obtention de la valeur 0 est de loin la pire méthode (et cela modifie l'ordre de votre tableau, ce qui n'est peut-être pas souhaitable). Pour les autres, la différence est négligeable sauf si vous parlez de millions d'indices.
Résultats moyens de cinq exécutions avec un tableau de 100 000 indices de nombres aléatoires:
la source
jsperf tests
pour ce qui précèdeJ'ai trouvé que pour les tableaux plus gros (~ 100k éléments), il est en fait payant de simplement itérer le tableau avec une humble
for
boucle, en effectuant environ 30% de mieux queMath.max.apply()
:Résultats de référence
la source
Vous pouvez trier le tableau par ordre décroissant et obtenir le premier élément:
la source
sort(function(a,b){return b-a;})
[...].sort().pop()
Que dis-tu de ça:
la source
que diriez-vous d'utiliser Array.reduce ?
la source
-Infinity
.Presque toutes les réponses utilisent
Math.max.apply()
ce qui est agréable et dandy mais a des limites.Les arguments de fonction sont placés sur une pile qui a un inconvénient - une limite. Donc, si votre tableau est plus grand que la limite, il échouera avec
RangeError: Maximum call stack size exceeded.
Pour trouver une taille de pile d'appels, j'ai utilisé ce code:
Il s'est avéré être le plus grand sur FireFox sur ma machine - 591519 . Cela signifie que si votre tableau contient plus de 591519 éléments,
Math.max.apply()
cela entraînera RangeError .La meilleure solution pour ce problème est la méthode itérative (crédit: https://developer.mozilla.org/ ):
J'ai écrit sur cette question sur mon blog ici .
la source
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
la source
Trouver la valeur maximale et minimale de manière simple et manuelle. Ce code est beaucoup plus rapide que
Math.max.apply
; J'ai essayé jusqu'à 1000k nombres dans le tableau.la source
findmax()
donne le mauvais résultat s'il n'y a que des nombres négatifs dans le tableau;findmin()
donne le mauvais résultat pour un tableau vide.Pour trouver le plus grand nombre dans un tableau que vous avez juste besoin d'utiliser
Math.max(...arrayName);
, cela fonctionne comme ceci:Pour en savoir plus sur
Math.max
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/maxla source
Oui bien sûr existent:
Math.max.apply(null,[23,45,67,-45])
et le résultat revient67
;la source
Doublure simple
la source
Ne pas oublier que l'emballage peut être fait avec
Function.prototype.bind
, vous donnant un « tout-native » fonction .la source
Vous pouvez également étendre
Array
cette fonction et l'intégrer à chaque tableau.la source
Vous pouvez également utiliser forEach :
la source
Utiliser -
Array.prototype.reduce()
c'est cool![267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)
où acc = accumulateur et val = valeur actuelle ;
la source
Vous pouvez essayer ça,
la source
Je viens de commencer avec JS mais je pense que cette méthode serait bien:
la source
array
ne contient que des nombres négatifs.Trouver le plus grand nombre dans un tableau multidimensionnel
la source
var tmax = Math.max.apply(Math, max)
, ou mieux encore, utiliser une fermeture d'une fonction de boucle, par exemple dans stackoverflow.com/a/54980012/7438857 . Avec cette modification, il est préférable de répondre à une question distincte, comment "trouvez-vous le plus grand nombre dans un tableau multidimensionnel", ou sur stackoverflow.com/questions/32616910/… . WIP: jsfiddle.net/jamesray/3cLu9for/8 .Lance ça:
Et maintenant essayez les
[3,10,2].max()
retours10
la source
Rechercher les valeurs Max et Min à l'aide du tri à bulles
la source
Essaye ça
la source
Selon le commentaire de @ Quasimondo , qui semble avoir été largement manqué, ce qui suit semble avoir les meilleures performances comme indiqué ici: https://jsperf.com/finding-maximum-element-in-an-array . Notez que tandis que pour le tableau dans la question, les performances peuvent ne pas avoir un effet significatif, pour les tableaux de grande taille, les performances deviennent plus importantes, et encore une fois, comme indiqué, l' utilisation
Math.max()
ne fonctionne même pas si la longueur du tableau est supérieure à 65 535. Voir également cette réponse .la source
Une approche récursive sur la façon de le faire en utilisant des opérateurs ternaires
la source
for/of
Solution à une boucle:la source