J'ai ceci:
var arr = [0, 21, 22, 7];
Quelle est la meilleure façon de renvoyer l'index de la valeur la plus élevée dans une autre variable?
javascript
arrays
max
Stephen
la source
la source
Réponses:
C'est probablement le meilleur moyen, car il est fiable et fonctionne sur les anciens navigateurs:
Il y a aussi ce one-liner:
Il effectue deux fois plus de comparaisons que nécessaire et lancera un
RangeError
sur les grands tableaux, cependant. Je m'en tiendrai à la fonction.la source
const max = arr.reduce((m, n) => Math.max(m, n))
, puis les index du max sont[...arr.keys()].filter(i => arr[i] === max)
.[...arr.keys()]
unexpected token
En une ligne et probablement plus rapide alors
arr.indexOf(Math.max.apply(Math, arr))
:Où:
iMax
- le meilleur index jusqu'à présent (l'index de l'élément max jusqu'à présent, à la première itérationiMax = 0
car le deuxième argument dereduce()
est0
, nous ne pouvons pas omettre le deuxième argument dereduce()
dans notre cas)x
- l'élément actuellement testé du tableaui
- l'indice actuellement testéarr
- notre tableau ([0, 21, 22, 7]
)À propos de la
reduce()
méthode (extrait de "JavaScript: The Definitive Guide" de David Flanagan):la source
arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);
qui peut être décrite comme suit: iterate la matrice à partir de l' indice 0 (deuxième paramètre), si currentlyTestedValue est supérieure à la valeur de l'élément à l' bestIndexSoFar , puis retourner le currentlyTestedIndex à l'itération suivante en tant que bestIndexSoFar .this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
.Voici une autre solution, si vous utilisez ES6 en utilisant l'opérateur de propagation:
la source
Sauf erreur, je dirais que c'est pour écrire votre propre fonction.
la source
Si vous utilisez un trait de soulignement, vous pouvez utiliser ce joli short one-liner:
Il trouvera d'abord la valeur du plus grand élément du tableau, dans ce cas 22. Ensuite, il retournera l'index de l'endroit où 22 se trouve dans le tableau, dans ce cas 2.
la source
Une autre solution de max utilisant
reduce
:Cela renvoie
[5e-324, -1]
si le tableau est vide. Si vous voulez juste l'index, mettez[1]
après.Min via (Changer en
>
etMAX_VALUE
):la source
EDIT: Il y a des années, j'ai donné une réponse à cela qui était grossière, trop précise et trop compliquée. Alors je le modifie. Je préfère les réponses fonctionnelles ci-dessus pour leur aspect soigné mais pas pour leur lisibilité; mais si j'étais plus familier avec javascript, je les aimerais peut-être aussi pour cela.
Pseudo code:
Index de suivi contenant la plus grande valeur. Supposons que l'indice 0 soit le plus grand au départ. Comparez avec l'index actuel. Mettez à jour l'index avec la valeur la plus élevée si nécessaire.
Code:
la source
passer
array
àhaystack
etMath.max(...array)
àneedle
. Cela donnera tous les éléments max du tableau, et il est plus extensible (par exemple, vous devez également trouver des valeurs min)la source
Si vous créez une copie du tableau et le triez par ordre décroissant, le premier élément de la copie sera le plus grand. Ensuite, vous pouvez trouver son index dans le tableau d'origine.
La complexité en temps est O (n) pour la copie, O (n * log (n)) pour le tri et O (n) pour l'indexOf.
Si vous devez le faire plus rapidement, la réponse de Ry est O (n).
la source
la source
Une version stable de cette fonction ressemble à ceci:
la source