Iteração avançada em arrays
Aula sobre métodos de iteração avançada em arrays no JavaScript, incluindo forEach, some/every, find/findIndex e sort, com explicações detalhadas, exemplos práticos e exercícios com respostas.
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: 5Com arrow function:
numeros.forEach(numero => console.log(numero * 2));
// 2, 4, 6, 8, 10some/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); // 2findIndex é 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
adeve vir antes deb - zero se são iguais
- positivo se
adeve vir depois deb
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
fortradicionais para código mais declarativo. - Use
some/everypara testar condições,find/findIndexpara busca única, eforEachpara efeitos colaterais. - Sempre forneça função de comparação para
sortao ordenar números. - Cuidado com a mutação do array original; faça cópias quando necessário.
Referências
- MDN: Array.prototype.forEach
- MDN: Array.prototype.some
- MDN: Array.prototype.every
- MDN: Array.prototype.find
- MDN: Array.prototype.findIndex
- MDN: Array.prototype.sort
- JavaScript.info: Array methods
Exercícios
Dado o array
const nums = [3, 7, 1, 9, 4];, useforEachpara exibir no console o quadrado de cada número.✓ Resposta:const nums = [3, 7, 1, 9, 4]; nums.forEach(num => console.log(num * num));Verifique se no array
[2, 4, 6, 8]todos os números são pares usandoevery. Depois, verifique se algum número é ímpar usandosome.✓ 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); // falseDado 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 usandofinde seu índice usandofindIndex.✓ 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); // 1Ordene o array
[15, 2, 30, 4]em ordem crescente usandosortcom 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]Usando
sortelocaleCompare, 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çã']