Tengo esto:
var arr = [0, 21, 22, 7];
¿Cuál es la mejor manera de devolver el índice del valor más alto en otra variable?
javascript
arrays
max
Stephen
fuente
fuente
Respuestas:
Esta es probablemente la mejor manera, ya que es confiable y funciona en navegadores antiguos:
También hay esta frase:
Sin
RangeError
embargo, realiza el doble de comparaciones que sea necesario y arrojará una en matrices grandes. Me apegaría a la función.fuente
const max = arr.reduce((m, n) => Math.max(m, n))
, luego los índices del máximo son[...arr.keys()].filter(i => arr[i] === max)
.[...arr.keys()]
genera un error:unexpected token
En una línea y probablemente más rápido que
arr.indexOf(Math.max.apply(Math, arr))
:Dónde:
iMax
- el mejor índice hasta ahora (el índice del elemento max hasta ahora, en la primera iteracióniMax = 0
porque el segundo argumentoreduce()
es0
, no podemos omitir el segundo argumentoreduce()
en nuestro caso)x
- el elemento actualmente probado de la matrizi
- el índice actualmente probadoarr
- nuestra matriz ([0, 21, 22, 7]
)Sobre el
reduce()
método (de "JavaScript: la guía definitiva" de David Flanagan):fuente
arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);
, que se puede describir como: Iterar la matriz a partir de índice de 0 (segundo parámetro), si currentlyTestedValue es mayor que el valor del elemento en el bestIndexSoFar , a continuación, devolver el currentlyTestedIndex a la siguiente iteración como la bestIndexSoFar .this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
.Aquí hay otra solución, si está utilizando ES6 utilizando el operador de propagación:
fuente
A menos que me equivoque, diría que es escribir su propia función.
fuente
Si está utilizando guiones bajos, puede utilizar este breve resumen:
Primero encontrará el valor del elemento más grande en la matriz, en este caso 22. Luego devolverá el índice de donde 22 está dentro de la matriz, en este caso 2.
fuente
Otra solución de max usando
reduce
:Esto vuelve
[5e-324, -1]
si la matriz está vacía. Si solo quieres el índice, ponlo[1]
después.Min via (Cambiar a
>
yMAX_VALUE
):fuente
EDITAR: Hace años le di una respuesta a esto que era asquerosa, demasiado específica y demasiado complicada. Entonces lo estoy editando. Estoy a favor de las respuestas funcionales anteriores por su factor ordenado pero no por su legibilidad; pero si estuviera más familiarizado con javascript, entonces también me gustaría para eso.
Pseudocódigo:
Índice de seguimiento que contiene el mayor valor. Suponga que el índice 0 es el más grande inicialmente. Comparar con el índice actual. Actualice el índice con el mayor valor si es necesario.
Código:
fuente
pasar
array
ahaystack
yMath.max(...array)
aneedle
. Esto le dará todos los elementos máximos de la matriz, y es más extensible (por ejemplo, también necesita encontrar valores mínimos)fuente
Si crea una copia de la matriz y la ordena descendiendo, el primer elemento de la copia será el más grande. Entonces puede encontrar su índice en la matriz original.
La complejidad temporal es O (n) para la copia, O (n * log (n)) para la clasificación y O (n) para el indexOf.
Si necesita hacerlo más rápido, la respuesta de Ry es O (n).
fuente
fuente
Una versión estable de esta función se ve así:
fuente
Sencillo
fuente