Eu tenho um simples objeto JavaScript Array que contém alguns números.
[267, 306, 108]
Existe uma função que encontre o maior número nessa matriz?
javascript
algorithm
arrays
max
dotty
fonte
fonte
Math.max(...[267, 306, 108]);
Respostas:
Resig para o resgate:
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.
fonte
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 :
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:
A função aplicar irá executar:
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.
fonte
A sintaxe mais fácil, com o novo operador de propagação :
Fonte: Mozilla MDN
fonte
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:
fonte
jsperf tests
para o acima expostoDescobri que para matrizes maiores (~ 100k elementos), na verdade vale a pena simplesmente iterar a matriz com um
for
loop humilde , com desempenho ~ 30% melhor queMath.max.apply()
:Resultados de referência
fonte
Você pode classificar a matriz em ordem decrescente e obter o primeiro item:
fonte
sort(function(a,b){return b-a;})
[...].sort().pop()
Que tal agora:
fonte
Que tal usar Array.reduce ?
fonte
-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á com
RangeError: Maximum call stack size exceeded.
Para encontrar um tamanho de pilha de chamadas, usei este código:
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/ ):
Eu escrevi sobre esta questão no meu blog aqui .
fonte
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
fonte
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.fonte
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:Para saber mais sobre
Math.max
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/maxfonte
Sim, é claro que existe:
Math.max.apply(null,[23,45,67,-45])
e o resultado retorna67
;fonte
Forro simples
fonte
Não se esqueça que o envoltório pode ser feito com
Function.prototype.bind
, dando-lhe um "tudo-nativo" função .fonte
Você também pode estender
Array
para ter essa função e torná-la parte de cada matriz.fonte
Você também pode usar o forEach :
fonte
Usando -
Array.prototype.reduce()
é legal![267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)
onde acc = acumulador e val = valor atual ;
fonte
Você pode tentar isso,
fonte
Comecei com JS, mas acho que esse método seria bom:
fonte
array
contiver apenas números negativos.Encontre o maior número em uma matriz multidimensional
fonte
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 .Rode isto:
E agora tente
[3,10,2].max()
retornos10
fonte
Encontre o valor máximo e mínimo usando a classificação de bolha
fonte
Tente isto
fonte
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 .fonte
Uma abordagem recursiva sobre como fazê-lo usando operadores ternários
fonte
for/of
Solução de um loop:fonte