validar validacion recorrer objetos lista formularios formulario enviar ejemplos con array antes javascript algorithm arrays max

validacion - ¿Cómo puedo encontrar el número más grande contenido en una matriz de JavaScript?



validar formulario javascript html5 (20)

Encuentra el número más grande en una matriz multidimensional

var max = []; for(var i=0; arr.length>i; i++ ){ var arra = arr[i]; var largest = Math.max.apply(Math, arra); max.push(largest); } return max;

Tengo un objeto Array de JavaScript simple que contiene algunos números.

[267, 306, 108]

¿Hay alguna función que pueda encontrar el número más grande en esta matriz?


¿ Array.reduce hay de usar Array.reduce ?

[0,1,2,3,4].reduce(function(previousValue, currentValue){ return Math.max(previousValue,currentValue); });


Casi todas las respuestas usan Math.max.apply() que es bueno y elegante, pero tiene limitaciones.

Los argumentos de funciones se colocan en la pila que tiene un inconveniente: un límite. Entonces, si su matriz es mayor 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:

var ar = []; for (var i = 1; i < 100*99999; i++) { ar.push(1); try { var max = Math.max.apply(Math, ar); } catch(e) { console.log(''Limit reached: ''+i+'' error is: ''+e); break; } }

Resultó ser el más grande en FireFox en mi máquina - 591519 . Esto significa que si la 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/ ):

max = -Infinity, min = +Infinity; for (var i = 0; i < numbers.length; i++) { if (numbers[i] > max) max = numbers[i]; if (numbers[i] < min) min = numbers[i]; }

He escrito sobre esta pregunta en mi blog here .


Ejecuta esto:

Array.prototype.max = function(){ return Math.max.apply( Math, this ); };

Y ahora prueba [3,10,2].max() devuelve 10


Empecé con JS, pero creo que este método sería bueno:

var array = [34, 23, 57, 983, 198];<br> var score = 0; for(var i = 0; i = array.length; i++) { if(array[ i ] > score) { score = array[i]; } }


Encontrar el valor máximo y mínimo de la 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 la matriz.

function findmax(array) { var max = 0; var a = array.length; for (counter=0;counter<a;counter++) { if (array[counter] > max) { max = array[counter]; } } return max; } function findmin(array) { var min = array[0]; var a = array.length; for (counter=0;counter<a;counter++) { if (array[counter] < min) { min = array[counter]; } } return min; }


He descubierto que para arreglos más grandes (~ 100k elementos), realmente vale iterar simplemente la matriz con un bucle for humilde, realizando ~ 30% mejor que Math.max.apply() :

function mymax(a) { var m = -Infinity, i = 0, n = a.length; for (; i != n; ++i) { if (a[i] > m) { m = a[i]; } } return m; }

Resultados de referencia



No olvides que el ajuste se puede hacer con Function.prototype.bind , dándote una función "totalmente nativa".

var aMax = Math.max.apply.bind(Math.max, Math); aMax([1, 2, 3, 4, 5]); // 5


No soy un experto en JS, pero quería ver cómo estos métodos se acumulan, así que esta fue una buena práctica para mí. No sé si técnicamente esta es la forma correcta de evaluar el rendimiento de estos, pero los ejecuté uno tras otro, como puede ver en mi código.

Ordenar y obtener el valor 0 es, de lejos, 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 100.000 números aleatorios:

  • reducir tomó 4,0392ms para ejecutar
  • Math.max.apply tomó 3.3742ms para ejecutarse
  • ordenar y obtener el valor 0th tomó 67.4724ms para ejecutarse
  • Math.max dentro de reduce () tomó 6.5804ms para ejecutarse
  • la función personalizada de FindMax tomó 1.6102ms para ejecutarse

var performance = window.performance function findmax(array) { var max = 0, a = array.length, counter for (counter=0;counter<a;counter++) { if (array[counter] > max) { max = array[counter] } } return max } function findBiggestNumber(num) { var counts = [] var i for (i = 0; i < num; i++) { counts.push(Math.random()) } var a, b a = performance.now() var biggest = counts.reduce(function(highest, count){ return highest > count ? highest : count }, 0) b = performance.now() console.log(''reduce took '' + (b - a) + '' ms to run'') a = performance.now() var biggest2 = Math.max.apply(Math, counts) b = performance.now() console.log(''Math.max.apply took '' + (b - a) + '' ms to run'') a = performance.now() var biggest3 = counts.sort(function(a,b){return b-a;})[0] b = performance.now() console.log(''sorting and getting the 0th value took '' + (b - a) + '' ms to run'') a = performance.now() var biggest4 = counts.reduce(function(highest, count){ return Math.max(highest,count) }, 0) b = performance.now() console.log(''Math.max within reduce() took '' + (b - a) + '' ms to run'') a = performance.now() var biggest5 = findmax(counts) b = performance.now() console.log(''custom findmax function took '' + (b - a) + '' ms to run'') console.log(biggest + ''-'' + biggest2 + ''-'' + biggest3 + ''-'' + biggest4 + ''-'' + biggest5) } findBiggestNumber(1E5)


Puede ordenar la matriz en orden descendente y obtener el primer elemento:

[267, 306, 108].sort(function(a,b){return b-a;})[0]


Puede usar la función de aplicar para llamar a Math.max :

var array = [267, 306, 108]; var largest = Math.max.apply(Math, array); // 306

¿Cómo funciona?

La función apply se usa para llamar a otra función, con un contexto y argumentos dados, proporcionados como una matriz. Las funciones mínima y máxima pueden tomar una cantidad arbitraria de argumentos de entrada: Math.max (val1, val2, ..., valN)

Entonces si llamamos:

Math.min.apply(Math, [1,2,3,4]);

La función aplicar se ejecutará:

Math.min(1,2,3,4);

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.


Puedes probar esto,

var arr = [267,306,108]; var largestNum = 0; for(i=0;i<arr.length;i++) { if(arr[i]>largest){ var largest = arr[i]; } } console.log(largest);


Qué tal esto:

var arr = [1,2,3,4]; var largest = arr.reduce(function(x,y){ return (x > y) ? x : y; }); console.log(largest);


Sí, por supuesto, existe: Math.max.apply(null,[23,45,67,-45]) y el resultado devuelve 67 ;


También podría extender Array para tener esta función y hacerla parte de cada matriz.

Array.prototype.max = function(){return Math.max.apply( Math, this )}; myArray = [1,2,3]; console.log( myArray.max() );


También puede usar forEach :

var maximum = Number.MIN_SAFE_INTEGER; var array = [-3, -2, 217, 9, -8, 46]; array.forEach(function(value){ if(value > maximum) { maximum = value; } }); console.log(maximum); // 217


Usar - Array.prototype.reduce() es genial!

[267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)

donde acc = acumulador y val = valor actual ;

var a = [267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val); console.log(a);


Resig al rescate:

Array.max = function( array ){ return Math.max.apply( Math, array ); };