Nesta aula, vamos explorar métodos de iteração avançada em arrays no JavaScript. Esses métodos permitem percorrer, testar e transformar arrays de forma declarativa e eficiente, evitando loops manuais e tornando o código mais legível e expressivo.

Dominar esses métodos é essencial para qualquer desenvolvedor JavaScript, pois eles são amplamente utilizados em projetos reais e em frameworks modernos. Vamos cobrir forEach, some, every, find, findIndex e sort, destacando suas características, pegadinhas e boas práticas.

forEach

O método forEach executa uma função para cada elemento do array, em ordem. Ele é útil quando você precisa realizar uma ação em cada item, como exibir no console, adicionar a outro array ou modificar objetos in-place. Diferente de map e filter, forEach não retorna um novo array; ele sempre retorna undefined.

A função callback recebe três argumentos: o valor atual, o índice (opcional) e o array original (opcional). Cuidado: forEach não pode ser interrompido (break não funciona). Se precisar interromper, use um loop for ou some/every.

const numeros = [1, 2, 3, 4, 5];

numeros.forEach(function(numero, indice) {
  console.log(`Índice ${indice}: ${numero}`);
});
// Saída:
// Índice 0: 1
// Índice 1: 2
// Índice 2: 3
// Índice 3: 4
// Índice 4: 5

Com arrow function:

numeros.forEach(numero => console.log(numero * 2));
// 2, 4, 6, 8, 10

some/every

Os métodos some e every testam os elementos do array com uma condição e retornam um booleano. some retorna true se pelo menos um elemento satisfaz a condição; every retorna true apenas se todos os elementos satisfazem. Ambos interrompem a iteração assim que o resultado é determinado (short-circuit).

A função callback recebe os mesmos três argumentos e deve retornar um valor booleano. São ideais para validações e verificações rápidas.

const idades = [12, 18, 25, 30];

const temMaiorDeIdade = idades.some(idade => idade >= 18);
console.log(temMaiorDeIdade); // true

const todosMaiores = idades.every(idade => idade >= 18);
console.log(todosMaiores); // false (12 não é maior ou igual a 18)

Exemplo com array vazio: [].some(fn) retorna false, [].every(fn) retorna true (vacuously true).

find/findIndex

find retorna o primeiro elemento que satisfaz a condição, ou undefined se nenhum for encontrado. findIndex retorna o índice do primeiro elemento que satisfaz, ou -1 se não encontrado. Ambos interrompem a iteração ao encontrar o primeiro match.

São úteis para buscar um objeto específico em um array de objetos, ou encontrar um valor único.

const usuarios = [
  { id: 1, nome: 'Ana' },
  { id: 2, nome: 'Bruno' },
  { id: 3, nome: 'Carla' }
];

const usuario = usuarios.find(u => u.id === 2);
console.log(usuario); // { id: 2, nome: 'Bruno' }

const indice = usuarios.findIndex(u => u.nome === 'Carla');
console.log(indice); // 2

findIndex é especialmente útil para remover um elemento do array usando splice.

sort e suas pegadinhas

O método sort ordena os elementos do array in-place (modifica o array original) e retorna o array ordenado. Por padrão, sort converte os elementos em strings e os ordena lexicograficamente (ordem alfabética). Isso pode levar a resultados inesperados com números: [10, 2, 1].sort() retorna [1, 10, 2].

Para ordenar números corretamente, é necessário fornecer uma função de comparação que retorne um número negativo, zero ou positivo. A função recebe dois elementos a e b e deve retornar:

  • negativo se a deve vir antes de b
  • zero se são iguais
  • positivo se a deve vir depois de b
const numeros = [10, 2, 1, 20];

// Ordem crescente
numeros.sort((a, b) => a - b);
console.log(numeros); // [1, 2, 10, 20]

// Ordem decrescente
numeros.sort((a, b) => b - a);
console.log(numeros); // [20, 10, 2, 1]

Para strings, a ordenação padrão já funciona, mas pode ser afetada por acentos e maiúsculas. Use localeCompare para ordenação linguística.

const palavras = ['café', 'árvore', 'bola'];
palavras.sort((a, b) => a.localeCompare(b, 'pt-BR'));
console.log(palavras); // ['árvore', 'bola', 'café']

Pegadinha importante: sort modifica o array original. Se precisar manter o original, faça uma cópia antes: const copia = [...array].sort(...).

Boas práticas

  • Prefira métodos de iteração a loops for tradicionais para código mais declarativo.
  • Use some/every para testar condições, find/findIndex para busca única, e forEach para efeitos colaterais.
  • Sempre forneça função de comparação para sort ao ordenar números.
  • Cuidado com a mutação do array original; faça cópias quando necessário.

Referências

Exercícios

  1. Dado o array const nums = [3, 7, 1, 9, 4];, use forEach para exibir no console o quadrado de cada número.

    ✓ Resposta:
    const nums = [3, 7, 1, 9, 4];
    nums.forEach(num => console.log(num * num));
  2. Verifique se no array [2, 4, 6, 8] todos os números são pares usando every. Depois, verifique se algum número é ímpar usando some.

    ✓ Resposta:
    const arr = [2, 4, 6, 8];
    const todosPares = arr.every(num => num % 2 === 0);
    console.log(todosPares); // true
    
    const algumImpar = arr.some(num => num % 2 !== 0);
    console.log(algumImpar); // false
  3. Dado o array de objetos const produtos = [{ nome: 'Mouse', preco: 50 }, { nome: 'Teclado', preco: 120 }, { nome: 'Monitor', preco: 800 }];, encontre o primeiro produto com preço maior que 100 usando find e seu índice usando findIndex.

    ✓ Resposta:
    const produtos = [
      { nome: 'Mouse', preco: 50 },
      { nome: 'Teclado', preco: 120 },
      { nome: 'Monitor', preco: 800 }
    ];
    
    const produto = produtos.find(p => p.preco > 100);
    console.log(produto); // { nome: 'Teclado', preco: 120 }
    
    const indice = produtos.findIndex(p => p.preco > 100);
    console.log(indice); // 1
  4. Ordene o array [15, 2, 30, 4] em ordem crescente usando sort com função de comparação. Depois, em ordem decrescente.

    ✓ Resposta:
    const arr = [15, 2, 30, 4];
    
    // Crescente
    arr.sort((a, b) => a - b);
    console.log(arr); // [2, 4, 15, 30]
    
    // Decrescente
    arr.sort((a, b) => b - a);
    console.log(arr); // [30, 15, 4, 2]
  5. Usando sort e localeCompare, ordene o array ['maçã', 'laranja', 'abacaxi', 'banana'] em ordem alfabética (considere o português).

    ✓ Resposta:
    const frutas = ['maçã', 'laranja', 'abacaxi', 'banana'];
    frutas.sort((a, b) => a.localeCompare(b, 'pt-BR'));
    console.log(frutas); // ['abacaxi', 'banana', 'laranja', 'maçã']