Respostas:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Aviso : como o número máximo de argumentos é tão baixo quanto 65535 em algumas VMs , use um loop for se não tiver certeza de que a matriz é tão pequena.
apply
ligação pode eliminar isso com muita facilidade.
RangeError: Maximum call stack size exceeded.
Você pode usar a função aplicar, para chamar Math.max :
var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306
Como funciona?
A função apply é usada para chamar outra função, com um determinado contexto e argumentos, fornecidos como uma matriz. As funções min e max podem receber um número arbitrário de argumentos de entrada: Math.max (val1, val2, ..., valN)
Então, se chamarmos:
Math.min.apply(Math, [1,2,3,4]);
A função aplicar irá executar:
Math.min(1,2,3,4);
Observe que o primeiro parâmetro, o contexto, não é importante para essas funções, pois são estáticas; elas funcionarão independentemente do que é passado como contexto.
A sintaxe mais fácil, com o novo operador de propagação :
var arr = [1, 2, 3];
var max = Math.max(...arr);
Fonte: Mozilla MDN
Não sou especialista em JS, mas queria ver como esses métodos se compilam, portanto, isso foi uma boa prática para mim. Não sei se é tecnicamente o caminho certo para testar esses desempenhos, mas apenas os executei um após o outro, como você pode ver no meu código.
Classificar e obter o valor 0 é de longe o pior método (e modifica a ordem da sua matriz, o que pode não ser desejável). Para os outros, a diferença é insignificante, a menos que você esteja falando de milhões de índices.
Resultados médios de cinco execuções com uma matriz de 100.000 índices de números aleatórios:
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)
jsperf tests
para o acima exposto
Descobri que para matrizes maiores (~ 100k elementos), na verdade vale a pena simplesmente iterar a matriz com um for
loop humilde , com desempenho ~ 30% melhor 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;
}
Você pode classificar a matriz em ordem decrescente e obter o primeiro item:
[267, 306, 108].sort(function(a,b){return b-a;})[0]
sort(function(a,b){return b-a;})
[...].sort().pop()
Que tal agora:
var arr = [1,2,3,4];
var largest = arr.reduce(function(x,y){
return (x > y) ? x : y;
});
console.log(largest);
Que tal usar Array.reduce ?
[0,1,2,3,4].reduce(function(previousValue, currentValue){
return Math.max(previousValue,currentValue);
});
-Infinity
.
Quase todas as respostas usam o Math.max.apply()
que é bom e elegante, mas tem limitações.
Os argumentos da função são colocados na pilha que tem uma desvantagem - um limite. Portanto, se sua matriz for maior que o limite, ela falhará comRangeError: Maximum call stack size exceeded.
Para encontrar um tamanho de pilha de chamadas, usei 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;
}
}
Ele provou ser o maior no FireFox na minha máquina - 591519 . Isso significa que, se sua matriz contiver mais de 591519 itens, Math.max.apply()
resultará em RangeError .
A melhor solução para esse problema é a maneira 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];
}
Eu escrevi sobre esta questão no meu blog aqui .
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
const inputArray = [ 1, 3, 4, 9, 16, 2, 20, 18];
const maxNumber = Math.max(...inputArray);
console.log(maxNumber);
Encontrar o valor máximo e mínimo da maneira fácil e manual. Este código é muito mais rápido que Math.max.apply
; Eu tentei até 1000k números na 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;
}
findmax()
fornece o resultado errado se houver apenas números negativos na matriz; findmin()
fornece o resultado errado para uma matriz vazia.
Para encontrar o maior número em uma matriz que você só precisa usar Math.max(...arrayName);
, ele funciona assim:
let myArr = [1, 2, 3, 4, 5, 6];
console.log(Math.max(...myArr));
Para saber mais sobre Math.max
:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
Sim, é claro que existe: Math.max.apply(null,[23,45,67,-45])
e o resultado retorna 67
;
Forro simples
[].sort().pop()
Você também pode estender Array
para ter essa função e torná-la parte de cada matriz.
Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];
console.log( myArray.max() );
Você também pode usar o 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
Usando - Array.prototype.reduce()
é legal!
[267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)
onde acc = acumulador e val = valor atual ;
var a = [267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val);
console.log(a);
Você pode tentar isso,
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);
Comecei com JS, mas acho que esse método seria bom:
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];
}
}
array
contiver apenas números negativos.
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;
var tmax = Math.max.apply(Math, max)
, por exemplo , ou melhor ainda, usar o fechamento de uma função de loop, por exemplo, em stackoverflow.com/a/54980012/7438857 . Com essa modificação, é melhor responder a uma pergunta separada, como você "encontra o maior número em uma matriz multidimensional" ou em stackoverflow.com/questions/32616910/… . WIP: jsfiddle.net/jamesray/3cLu9for/8 .
Encontre o valor máximo e mínimo usando a classificação de bolha
var arr = [267, 306, 108];
for(i=0, k=0; i<arr.length; i++) {
for(j=0; j<i; j++) {
if(arr[i]>arr[j]) {
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}
}
console.log('largest Number: '+ arr[0]);
console.log('Smallest Number: '+ arr[arr.length-1]);
Conforme o comentário de @ Quasimondo , que parece ter sido amplamente esquecido, o abaixo parece ter o melhor desempenho, como mostrado aqui: https://jsperf.com/finding-maximum-element-in-an-array . Observe que, para a matriz em questão, o desempenho pode não ter um efeito significativo, para matrizes grandes o desempenho se torna mais importante e, novamente, conforme observado, o uso Math.max()
nem funciona se o comprimento da matriz for superior a 65535. Consulte também esta resposta .
function largestNum(arr) {
var d = data;
var m = d[d.length - 1];
for (var i = d.length - 1; --i > -1;) {
if (d[i] > m) m = d[i];
}
return m;
}
Uma abordagem recursiva sobre como fazê-lo usando operadores ternários
const findMax = (arr, max, i) => arr.length === i ? max :
findMax(arr, arr[i] > max ? arr[i] : max, ++i)
const arr = [5, 34, 2, 1, 6, 7, 9, 3];
const max = findMax(arr, arr[0], 0)
console.log(max);
for/of
Solução de um loop:
const numbers = [2, 4, 6, 8, 80, 56, 10];
const findMax = (...numbers) => {
let currentMax = numbers[0]; // 2
for (const number of numbers) {
if (number > currentMax) {
console.log(number, currentMax);
currentMax = number;
}
}
console.log('Largest ', currentMax);
return currentMax;
};
findMax(...numbers);
Math.max(...[267, 306, 108]);