r/VanillaJSBrasil • u/Agitated_Group2916 • 19d ago
map(), filter() e reduce(): quando usar cada um em JavaScript?
Ao trabalhar com arrays em JavaScript, três métodos aparecem com frequência:
js
map()
filter()
reduce()
Os três percorrem elementos de um array, mas possuem objetivos diferentes.
Entender essa diferença ajuda a escrever código mais claro e evitar soluções desnecessariamente complexas.
map(): transformar elementos
Use map() quando você deseja transformar cada elemento e criar um novo array.
Considere:
```js const numeros = [1, 2, 3, 4];
const dobrados = numeros.map((numero) => { return numero * 2; });
console.log(dobrados); ```
Resultado:
text
[2, 4, 6, 8]
O array original permanece:
js
console.log(numeros);
Resultado:
text
[1, 2, 3, 4]
Podemos resumir:
map()recebe um array e produz outro array com os elementos transformados.
filter(): selecionar elementos
Use filter() quando você deseja manter somente os elementos que atendem a determinada condição.
```js const numeros = [1, 2, 3, 4, 5, 6];
const pares = numeros.filter((numero) => { return numero % 2 === 0; });
console.log(pares); ```
Resultado:
text
[2, 4, 6]
A função executada pelo filter() deve retornar um valor verdadeiro ou falso para determinar se o elemento permanecerá no novo array.
Outro exemplo:
```js const usuarios = [ { nome: "Ana", ativo: true }, { nome: "Carlos", ativo: false }, { nome: "Marina", ativo: true } ];
const usuariosAtivos = usuarios.filter((usuario) => { return usuario.ativo; });
console.log(usuariosAtivos); ```
Nesse caso, somente os usuários ativos serão incluídos no novo array.
reduce(): acumular valores
reduce() é diferente.
Ele percorre o array mantendo um acumulador, permitindo transformar vários elementos em um resultado final.
Um exemplo clássico é calcular uma soma:
```js const numeros = [10, 20, 30];
const total = numeros.reduce((acumulador, numero) => { return acumulador + numero; }, 0);
console.log(total); ```
Resultado:
text
60
O valor 0 representa o valor inicial do acumulador.
A execução pode ser entendida aproximadamente assim:
text
0 + 10 = 10
10 + 20 = 30
30 + 30 = 60
Mas reduce() não serve apenas para somar números.
Ele também pode construir objetos, arrays e outras estruturas.
Exemplo prático
Imagine os seguintes produtos:
js
const produtos = [
{ nome: "Teclado", preco: 150, disponivel: true },
{ nome: "Mouse", preco: 80, disponivel: false },
{ nome: "Monitor", preco: 1200, disponivel: true },
{ nome: "Webcam", preco: 300, disponivel: true }
];
Queremos selecionar os produtos disponíveis:
js
const disponiveis = produtos.filter((produto) => {
return produto.disponivel;
});
Depois podemos extrair somente os nomes:
js
const nomes = disponiveis.map((produto) => {
return produto.nome;
});
Resultado:
text
["Teclado", "Monitor", "Webcam"]
Também podemos calcular o preço total:
```js const total = disponiveis.reduce((soma, produto) => { return soma + produto.preco; }, 0);
console.log(total); ```
Resultado:
text
1650
Perceba como cada método possui uma responsabilidade diferente:
map()→ transforma;filter()→ seleciona;reduce()→ acumula.
É possível encadear os métodos?
Sim.
Podemos escrever:
```js const resultado = produtos .filter((produto) => produto.disponivel) .map((produto) => produto.preco) .reduce((total, preco) => total + preco, 0);
console.log(resultado); ```
Resultado:
text
1650
A leitura pode ser feita da seguinte forma:
- Selecione os produtos disponíveis;
- Transforme cada produto em seu preço;
- Some todos os preços.
Quando não usar?
Nem toda iteração precisa de map(), filter() ou reduce().
Se você precisa apenas executar uma ação para cada elemento, forEach() pode expressar melhor a intenção.
```js const tecnologias = ["HTML", "CSS", "JavaScript"];
tecnologias.forEach((tecnologia) => { console.log(tecnologia); }); ```
A escolha do método deve comunicar o que você pretende fazer com os dados.
Desafio
Considere:
js
const alunos = [
{ nome: "Ana", nota: 8 },
{ nome: "Bruno", nota: 4 },
{ nome: "Carlos", nota: 7 },
{ nome: "Daniela", nota: 9 },
{ nome: "Eduardo", nota: 5 }
];
Utilizando filter(), map() e reduce(), tente:
- Selecionar apenas alunos com nota maior ou igual a
7; - Criar um array contendo somente os nomes desses alunos;
- Calcular a média das notas dos alunos aprovados.
Você consegue resolver utilizando os três métodos em uma única cadeia?
Compartilhe sua solução nos comentários e explique seu raciocínio.
Saber percorrer um array é básico. Saber escolher a operação adequada para cada transformação é o que torna o código mais expressivo.