JavaScript - Descobrir Menor e Maior valor em um Array


Neste artigo irei mostrar técnicas para resolver de forma muito simples, um problema que geralmente uma hora ou outra acabamos precisando solucionar (eu por exemplo, já me deparei com esse problema em uma entrevista de emprego). Essas técnicas podem não ser novidade para alguns, mas tenho certeza que poderá ser novidade (e de forte ajuda) para outros.

O problema

Digamos que você tenha um array com alguns números variados:

var random = [2, 3, 1, 4, 6, 5];

Agora você precisa:

  • Encontrar o menor valor dentro do array.
  • Encontrar o maior valor dentro do array.
  • Descobrir o índice de um valor específico.

E então, já sabe como fazer? Veja como é simples.

Menor e maior valor dentro do array

Olhando para o objeto Math nativo da linguagem JavaScript, podemos encontrar vários métodos úteis para realizar operações aritméticas mais complexas. Entre esses, temos os métodos Math.min e Math.max, que como você já deve ter imaginado, encontram respectivamente o menor e o maior valor entre um dado conjunto de números.

Maravilha! Problema resolvido. Será mesmo?

Bom, na verdade se você leu com atenção, deve ter notado que os métodos Math.min e Math.max encontram o menor e o maior valor entre um dado conjunto de números. Mas nós precisamos encontrar o menor e o maior valor de um array.

Vamos testar?

Abra o Chrome DevTools, Firefox Developer Tools, Firebug ou qualquer outra ferramenta que você use para brincar com JavaScript, e digite o código abaixo:

Math.min( [1, 2, 3] ); // Retorna: NaN
Math.max( [1, 2, 3] ); // Retorna: NaN

É, o resultado não foi o esperado. Mas isso pode ser resolvido com uma técnica bem simples.

O segredo da coisa é: podemos pegar funções que recebem um número indeterminado de argumentos (assim como Math.min e Math.max), e adaptá-las para serem utilizadas em um array, através do método .apply(). Não faz parte desse artigo explicar como o método .apply() funciona, mas você pode clicar no link anterior para ler mais sobre o ele.

Sacou a ideia? Ainda não? Após ver o exemplo abaixo tudo ficará mais claro.

// Funcao para retornar o menor valor de um array
Array.min = function(array) {
    return Math.min.apply(Math, array);
};

// Funcao para retornar o maior valor de um array
Array.max = function(array) {
    return Math.max.apply(Math, array);
};

// Agora e so pegar os resultados
var random = [2, 3, 1, 4, 6, 5];  // Nosso array
console.log( Array.min(random) ); // Menor valor
console.log( Array.max(random) ); // Maior valor

Ótimo! Agora sim temos boa parte do nosso problema resolvido.

Bom, em alguns casos você pode também receber um array que possui índices vazios ou que não possuem valores numéricos. Se esse for o seu caso, também é possível utilizar a técnica mostrada acima, basta fazer alguns ajustes para verificar os valores contidos no array antes de passá-lo como argumento para o método .apply(). Fazer essas verificações já foge do escopo desse artigo, mas caso você precise de ajuda para fazer isso, deixe um comentário abaixo.

Bônus: Descobrir o índice (posição) de um valor específico

Para finalizar, precisamos descobrir o índice (posição) de um dado valor específico dentro do nosso array.

Graças ao método nativo .indexOf(), fazer isso é muito, mas muito fácil. Basta digitar o seguinte código:

var random = [2, 3, 1, 4, 6, 5];  // Nosso array
console.log( random.indexOf(1) ); // Retorna a posicaoo do numero 1 no array

Pronto! Agora nosso problema foi resolvido por completo.

Referências