Até agora trabalhamos com variáveis que guardam um único valor em javascript. Mas e quando precisamos guardar uma lista de produtos, uma coleção de usuários, ou uma série de notas de um aluno? Para isso existem os arrays.
Arrays são listas ordenadas que podem guardar qualquer tipo de dado. São uma das estruturas mais usadas no JavaScript — e dominá-los, especialmente seus métodos modernos, é o que separa um iniciante de um desenvolvedor produtivo.
Criando arrays
// Array de strings
const frutas = ["maçã", "banana", "laranja"];
// Array de números
const notas = [8.5, 7.0, 9.5, 6.0];
// Array misto (possível, mas evite na prática)
const misturado = ["João", 25, true, null];
// Array vazio
const lista = [];
Arrays usam colchetes [] e os itens são separados por vírgula.
Acessando elementos
Cada elemento tem um índice que começa em zero:
const frutas = ["maçã", "banana", "laranja", "uva"];
console.log(frutas[0]); // maçã
console.log(frutas[1]); // banana
console.log(frutas[3]); // uva
console.log(frutas[4]); // undefined — não existe
// Último elemento — independente do tamanho:
console.log(frutas[frutas.length - 1]); // uva
Modificando elementos
const frutas = ["maçã", "banana", "laranja"];
frutas[1] = "manga"; // substituindo banana por manga
console.log(frutas); // ["maçã", "manga", "laranja"]
Propriedade length
const notas = [8.5, 7.0, 9.5, 6.0];
console.log(notas.length); // 4
Métodos essenciais — adicionando e removendo
const times = ["Flamengo", "Palmeiras"];
// Adiciona no final
times.push("Grêmio");
console.log(times); // ["Flamengo", "Palmeiras", "Grêmio"]
// Remove do final e retorna o elemento removido
const removido = times.pop();
console.log(removido); // "Grêmio"
console.log(times); // ["Flamengo", "Palmeiras"]
// Adiciona no início
times.unshift("Santos");
console.log(times); // ["Santos", "Flamengo", "Palmeiras"]
// Remove do início e retorna o elemento removido
const primeiro = times.shift();
console.log(primeiro); // "Santos"
console.log(times); // ["Flamengo", "Palmeiras"]
Encontrando elementos
const numeros = [10, 20, 30, 40, 50];
// indexOf — retorna o índice ou -1 se não encontrar
console.log(numeros.indexOf(30)); // 2
console.log(numeros.indexOf(99)); // -1
// includes — retorna true ou false
console.log(numeros.includes(40)); // true
console.log(numeros.includes(99)); // false
// find — retorna o primeiro elemento que satisfaz a condição
const encontrado = numeros.find(n => n > 25);
console.log(encontrado); // 30
// findIndex — retorna o índice do primeiro elemento que satisfaz
const indice = numeros.findIndex(n => n > 25);
console.log(indice); // 2
Os três métodos mais importantes — map, filter e reduce
Estes três métodos transformam a forma como você trabalha com listas. São funcionais, elegantes e amplamente usados em React, Node e em qualquer código moderno.
map — transformar cada elemento
map percorre o array e retorna um novo array com cada elemento transformado pela função que você passa:
const precos = [100, 250, 80, 400];
// Aplicar 10% de desconto em todos os preços
const comDesconto = precos.map(preco => preco * 0.9);
console.log(comDesconto); // [90, 225, 72, 360]
// O array original não é alterado
console.log(precos); // [100, 250, 80, 400]
Outro exemplo — transformar objetos:
const usuarios = [
{ nome: "Ana", idade: 25 },
{ nome: "Carlos", idade: 30 },
{ nome: "Bia", idade: 22 },
];
const nomes = usuarios.map(usuario => usuario.nome);
console.log(nomes); // ["Ana", "Carlos", "Bia"]
filter — filtrar elementos
filter percorre o array e retorna um novo array apenas com os elementos que passam na condição:
const notas = [4.5, 7.0, 8.5, 3.0, 9.5, 5.5];
const aprovados = notas.filter(nota => nota >= 6);
console.log(aprovados); // [7.0, 8.5, 9.5]
const reprovados = notas.filter(nota => nota < 6);
console.log(reprovados); // [4.5, 3.0, 5.5]
Com objetos:
const produtos = [
{ nome: "Notebook", preco: 3500, disponivel: true },
{ nome: "Mouse", preco: 80, disponivel: false },
{ nome: "Teclado", preco: 200, disponivel: true },
{ nome: "Monitor", preco: 1200, disponivel: false },
];
const disponiveis = produtos.filter(p => p.disponivel);
console.log(disponiveis);
// [{ nome: "Notebook", ... }, { nome: "Teclado", ... }]
const baratos = produtos.filter(p => p.preco < 500);
console.log(baratos);
// [{ nome: "Mouse", ... }, { nome: "Teclado", ... }]
reduce — reduzir a um único valor
reduce é o mais poderoso e o mais temido pelos iniciantes. Ele percorre o array acumulando um resultado — pode ser uma soma, um objeto, outro array, qualquer coisa.
// Sintaxe: array.reduce((acumulador, elementoAtual) => ..., valorInicial)
const numeros = [1, 2, 3, 4, 5];
const soma = numeros.reduce((acc, num) => acc + num, 0);
console.log(soma); // 15
Passo a passo do que acontece:
- Começa com
acc = 0 - Rodada 1:
acc = 0 + 1 = 1 - Rodada 2:
acc = 1 + 2 = 3 - Rodada 3:
acc = 3 + 3 = 6 - Rodada 4:
acc = 6 + 4 = 10 - Rodada 5:
acc = 10 + 5 = 15
Exemplo prático — total de um carrinho de compras:
const carrinho = [
{ produto: "Notebook", preco: 3500 },
{ produto: "Mouse", preco: 80 },
{ produto: "Teclado", preco: 200 },
];
const total = carrinho.reduce((acc, item) => acc + item.preco, 0);
console.log(`Total: R$ ${total}`); // Total: R$ 3780
Encadeando métodos
O verdadeiro poder aparece quando você combina map, filter e reduce em sequência:
const funcionarios = [
{ nome: "Ana", salario: 3000, ativo: true },
{ nome: "Carlos", salario: 5000, ativo: false },
{ nome: "Bia", salario: 4000, ativo: true },
{ nome: "Diego", salario: 2500, ativo: true },
];
// Total da folha apenas dos funcionários ativos com salário acima de 2800
const totalFolha = funcionarios
.filter(f => f.ativo)
.filter(f => f.salario > 2800)
.reduce((acc, f) => acc + f.salario, 0);
console.log(`Total da folha: R$ ${totalFolha}`); // R$ 7000
Leia de cima para baixo como uma frase: pegue os funcionários, filtre os ativos, filtre os com salário acima de 2800, some os salários.
Outros métodos úteis
const letras = ["c", "a", "b", "e", "d"];
// sort — ordena (modifica o array original!)
letras.sort();
console.log(letras); // ["a", "b", "c", "d", "e"]
// reverse — inverte
letras.reverse();
console.log(letras); // ["e", "d", "c", "b", "a"]
// slice — retorna uma parte do array (não modifica o original)
const frutas = ["maçã", "banana", "laranja", "uva", "kiwi"];
const algumas = frutas.slice(1, 3);
console.log(algumas); // ["banana", "laranja"]
// join — transforma o array em string
const palavras = ["JavaScript", "é", "incrível"];
console.log(palavras.join(" ")); // "JavaScript é incrível"
// flat — achata arrays aninhados
const aninhado = [1, [2, 3], [4, [5, 6]]];
console.log(aninhado.flat()); // [1, 2, 3, 4, [5, 6]]
console.log(aninhado.flat(2)); // [1, 2, 3, 4, 5, 6]
Cuidado com a mutação
Alguns métodos modificam o array original (push, pop, shift, unshift, sort, reverse, splice). Outros retornam um novo array sem tocar no original (map, filter, slice, concat).
Em código moderno e funcional, preferimos não mutar os dados originais:
const numeros = [3, 1, 4, 1, 5];
// ❌ Modifica o array original
numeros.sort();
// ✅ Cria uma cópia ordenada sem alterar o original
const ordenados = [...numeros].sort();
console.log(numeros); // [3, 1, 4, 1, 5] — intacto
console.log(ordenados); // [1, 1, 3, 4, 5]
O ... é o spread operator — vamos estudá-lo em detalhes no Artigo 07.
Tarefa para você
Dado o array abaixo, resolva cada desafio:
const alunos = [
{ nome: "Lucas", nota: 8.5, turma: "A" },
{ nome: "Mariana", nota: 5.0, turma: "B" },
{ nome: "Pedro", nota: 9.0, turma: "A" },
{ nome: "Camila", nota: 4.5, turma: "B" },
{ nome: "Rafael", nota: 7.5, turma: "A" },
];
- Filtre apenas os alunos aprovados (nota >= 6)
- Extraia apenas os nomes dos alunos da turma "A"
- Calcule a média geral de todos os alunos
- Desafio extra: retorne os nomes dos alunos aprovados da turma "A", em ordem alfabética
Conclusão
Neste artigo você aprendeu:
- Como criar e acessar elementos de um array
- Métodos para adicionar e remover elementos
- Como encontrar elementos com
find,findIndexeincludes - Os três métodos funcionais mais importantes:
map,filterereduce - Como encadear métodos para pipelines de dados
- A diferença entre métodos que mutam e os que não mutam
No próximo artigo vamos explorar os Objetos — a estrutura de dados que modela o mundo real no JavaScript.
📚 Fontes e Referências
- MDN Web Docs — Array: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array
- MDN Web Docs — Array.map: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/map
- MDN Web Docs — Array.filter: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
- MDN Web Docs — Array.reduce: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
- JavaScript.info — Arrays: https://javascript.info/array
- JavaScript.info — Array Methods: https://javascript.info/array-methods
- Eloquent JavaScript, Cap. 4 — Data Structures: https://eloquentjavascript.net/04_data.html
- You Don't Know JS: ES6 & Beyond — Kyle Simpson: https://github.com/getify/You-Dont-Know-JS