Tengo un simple objeto de matriz de JavaScript que contiene algunos números.
[267, 306, 108]
¿Hay una función que encuentre el número más grande en esta matriz?
javascript
algorithm
arrays
max
punteado
fuente
fuente
Math.max(...[267, 306, 108]);
Respuestas:
Resig al rescate:
Advertencia : dado que el número máximo de argumentos es tan bajo como 65535 en algunas máquinas virtuales , use un bucle for si no está seguro de que la matriz sea tan pequeña.
fuente
apply
llamada puede eliminarlo muy fácilmente.RangeError: Maximum call stack size exceeded.
Puede usar la función de aplicación para llamar a Math.max :
¿Cómo funciona?
El aplicar función de se usa para llamar a otra función, con un contexto y argumentos dados, proporcionados como una matriz. Las funciones min y max pueden tomar una cantidad arbitraria de argumentos de entrada: Math.max (val1, val2, ..., valN)
Entonces si llamamos:
La función de aplicación ejecutará:
Tenga en cuenta que el primer parámetro, el contexto, no es importante para estas funciones, ya que son estáticas, funcionarán independientemente de lo que se pase como contexto.
fuente
La sintaxis más fácil, con el nuevo operador de propagación :
Fuente: Mozilla MDN
fuente
No soy un experto en JS, pero quería ver cómo se comparan estos métodos, así que esta fue una buena práctica para mí. No sé si esta es técnicamente la forma correcta de probar estos, pero simplemente los ejecuté uno tras otro, como puede ver en mi código.
Ordenar y obtener el valor 0 es, con mucho, el peor método (y modifica el orden de su matriz, lo que puede no ser deseable). Para los demás, la diferencia es insignificante a menos que esté hablando de millones de índices.
Resultados promedio de cinco ejecuciones con una matriz de números aleatorios de 100,000 índices:
fuente
jsperf tests
lo anteriorDescubrí que para matrices más grandes (~ 100k elementos), en realidad vale la pena simplemente iterar la matriz con un
for
bucle humilde , con un rendimiento ~ 30% mejor queMath.max.apply()
:Resultados de referencia
fuente
Puede ordenar la matriz en orden descendente y obtener el primer elemento:
fuente
sort(function(a,b){return b-a;})
[...].sort().pop()
Qué tal esto:
fuente
¿ Qué tal usar Array.reduce ?
fuente
-Infinity
.Casi todas las respuestas usan lo
Math.max.apply()
que es agradable y elegante pero tiene limitaciones.Los argumentos de la función se colocan en la pila que tiene una desventaja: un límite. Entonces, si su matriz es más grande que el límite, fallará con
RangeError: Maximum call stack size exceeded.
Para encontrar un tamaño de pila de llamadas, utilicé este código:
Resultó ser el más grande en FireFox en mi máquina: 591519 . Esto significa que si su matriz contiene más de 591519 elementos,
Math.max.apply()
dará como resultado RangeError .La mejor solución para este problema es la forma iterativa (crédito: https://developer.mozilla.org/ ):
He escrito sobre esta pregunta en mi blog aquí .
fuente
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
fuente
Encontrar el valor máximo y mínimo de manera fácil y manual. Este código es mucho más rápido que
Math.max.apply
; He intentado hasta 1000k números en matriz.fuente
findmax()
da el resultado incorrecto si solo hay números negativos en la matriz;findmin()
da el resultado incorrecto para una matriz vacía.Para encontrar el número más grande en una matriz que solo necesita usar
Math.max(...arrayName);
, funciona así:Para obtener más información sobre
Math.max
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/maxfuente
Sí, por supuesto, existe:
Math.max.apply(null,[23,45,67,-45])
y el resultado vuelve67
;fuente
Un trazador de líneas simple
fuente
No hay que olvidar que la envoltura se puede hacer con
Function.prototype.bind
, que le da un "todo-nativa" función .fuente
También puede extender
Array
para tener esta función y hacerla parte de cada matriz.fuente
También puedes usar forEach :
fuente
¡Usar
Array.prototype.reduce()
es genial![267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)
donde acc = acumulador y val = valor actual ;
fuente
Puedes probar esto,
fuente
Acabo de comenzar con JS pero creo que este método sería bueno:
fuente
array
solo contiene números negativos.Encuentra el número más grande en una matriz multidimensional
fuente
var tmax = Math.max.apply(Math, max)
, por ejemplo , o mejor aún, usar el cierre de una función de bucle, por ejemplo, en stackoverflow.com/a/54980012/7438857 . Con esta modificación, es mejor responder a una pregunta por separado, ¿cómo "encuentra el número más grande en una matriz multidimensional", o en stackoverflow.com/questions/32616910/… . WIP: jsfiddle.net/jamesray/3cLu9for/8 .Ejecuta esto:
Y ahora intenta
[3,10,2].max()
devoluciones10
fuente
Encuentre el valor máximo y mínimo con el método de burbuja
fuente
Prueba esto
fuente
Según el comentario de @ Quasimondo , que parece haberse perdido en gran medida, el siguiente parece tener el mejor rendimiento como se muestra aquí: https://jsperf.com/finding-maximum-element-in-an-array . Tenga en cuenta que, aunque para el conjunto de la pregunta, el rendimiento puede no tener un efecto significativo, para el rendimiento de conjuntos grandes se vuelve más importante, y nuevamente, como se señaló, el uso
Math.max()
ni siquiera funciona si la longitud del conjunto es superior a 65535. Consulte también esta respuesta .fuente
Un enfoque recursivo sobre cómo hacerlo utilizando operadores ternarios
fuente
for/of
Solución de un bucle:fuente