Article image

DM

Diego Melo03/09/2026 12:06
Compartilhe

O guia prático para nunca mais escolher o método errado em JavaScript

    Você abre um projeto, encontra uma lista de usuários e precisa fazer alguma coisa com ela. Transformar os dados? Filtrar alguns itens? Encontrar uma pessoa específica? Aí aparecem três métodos muito comuns no JavaScript: map(), filter() e find(). Eles são parecidos. Mas resolvem problemas diferentes.

    Antes de tudo: pense no resultado que você quer

    Imagine este array:

    const usuarios = [
    { id: 1, nome: "Ana", ativo: true },
    { id: 2, nome: "Carlos", ativo: false },
    { id: 3, nome: "Marina", ativo: true }
    ];
    

    Agora esqueça os métodos por alguns segundos. Faça apenas uma pergunta: O que eu quero obter no final?

    • Se você quer transformar todos os itens, pense em map().
    • Se quer selecionar alguns itens, pense em filter().
    • Se quer encontrar apenas um item, pense em find().

    Essa regra já resolve boa parte da confusão.

    map(): quero transformar os dados

    O map() percorre um array e cria um novo array a partir da transformação de cada item. Imagine que você recebeu objetos completos, mas precisa mostrar somente os nomes dos usuários.

    const nomes = usuarios.map(usuario => {
    return usuario.nome;
    });
    
    console.log(nomes);
    

    Resultado:

    ["Ana", "Carlos", "Marina"]
    

    O array original tinha três objetos. O novo array continua com três posições, mas agora cada objeto virou uma string. Essa é uma boa pista sobre o map(): ele transforma.

    Podemos deixar o código ainda menor:

    const nomes = usuarios.map(usuario => usuario.nome);
    

    Outro exemplo: imagine um carrinho de compras.

    const precos = [10, 20, 30];
    
    const precosComDobro = precos.map(preco => preco * 2);
    
    console.log(precosComDobro);
    

    Resultado:

    [20, 40, 60]
    
    • Cada valor entrou.
    • Cada valor foi transformado.
    • Cada valor produziu outro valor.

    filter(): quero selecionar alguns itens

    Agora o problema mudou. Você não quer transformar todos os usuários. Quer somente aqueles que estão ativos.

    const usuariosAtivos = usuarios.filter(usuario => {
    return usuario.ativo === true;
    });
    
    console.log(usuariosAtivos);
    

    O resultado será:

    [
    { id: 1, nome: "Ana", ativo: true },
    { id: 3, nome: "Marina", ativo: true }
    ]
    

    O filter() faz uma pergunta para cada elemento: Este item deve continuar no novo array?

    1. Se a função retornar true, ele entra.
    2. Se retornar false, fica de fora.

    Podemos simplificar:

    const usuariosAtivos = usuarios.filter(
    usuario => usuario.ativo
    );
    

    Essa lógica aparece o tempo inteiro em aplicações reais.

    Filtrar produtos disponíveis:

    const disponiveis = produtos.filter(
    produto => produto.estoque > 0
    );
    

    Filtrar tarefas concluídas:

    const concluidas = tarefas.filter(
    tarefa => tarefa.concluida
    );
    

    Filtrar pessoas maiores de idade:

    const adultos = pessoas.filter(
    pessoa => pessoa.idade >= 18
    );
    

    A pergunta permanece a mesma: Quais elementos eu quero manter?

    find(): quero encontrar uma coisa

    Agora imagine que você recebeu um id pela URL:

    /usuarios/2
    

    Você não quer todos os usuários ativos. Também não quer transformar o array.

    Você quer encontrar o usuário com id 2.

    const usuario = usuarios.find(usuario => {
    return usuario.id === 2;
    });
    
    console.log(usuario);
    

    Resultado:

    {
    id: 2,
    nome: "Carlos",
    ativo: false
    }
    

    Perceba uma diferença importante.

    1. filter() retorna um array.
    2. find() retorna o primeiro elemento encontrado.

    Compare:

    const resultadoFilter = usuarios.filter(
    usuario => usuario.id === 2
    );
    
    const resultadoFind = usuarios.find(
    usuario => usuario.id === 2
    );
    

    Com filter(), o resultado continua sendo um array:

    [
    {
      id: 2,
      nome: "Carlos",
      ativo: false
    }
    ]
    

    Com find(), recebemos diretamente o objeto:

    {
    id: 2,
    nome: "Carlos",
    ativo: false
    }
    

    Parece uma diferença pequena. Até você tentar acessar o nome.

    Com find():

    console.log(resultadoFind.nome);
    

    Com filter():

    console.log(resultadoFilter[0].nome);
    

    Se você espera apenas um resultado, find() normalmente representa melhor sua intenção. Código bom não é apenas código que funciona. É código que deixa claro o que você queria fazer.

    O erro clássico: usar map() para tudo

    É comum encontrar algo assim no código de quem está começando:

    usuarios.map(usuario => {
    if (usuario.ativo) {
      console.log(usuario.nome);
    }
    });
    

    Funciona?

    Sim. Mas o map() não existe simplesmente para percorrer um array. A função dele é produzir um novo array transformado. Nesse exemplo, o resultado do map() nem está sendo usado.

    Se a intenção é selecionar usuários ativos, filter() expressa melhor isso:

    const ativos = usuarios.filter(
    usuario => usuario.ativo
    );
    

    Se a intenção é apenas executar uma ação para cada usuário, provavelmente forEach() representa melhor o que você quer:

    usuarios.forEach(usuario => {
    console.log(usuario.nome);
    });
    

    Os métodos até podem parecer intercambiáveis em alguns códigos. A intenção deles não é.

    Dá para combinar os métodos?

    Sim. E é aqui que eles começam a ficar realmente úteis. Imagine que você precisa pegar somente os usuários ativos e depois extrair seus nomes.

    Primeiro filtramos:

    const ativos = usuarios.filter(
    usuario => usuario.ativo
    );
    

    Depois transformamos:

    const nomes = ativos.map(
    usuario => usuario.nome
    );
    

    Também podemos encadear as operações:

    const nomes = usuarios
    .filter(usuario => usuario.ativo)
    .map(usuario => usuario.nome);
    

    Leia esse código quase como uma frase:

    pegue os usuários
    filtre os ativos
    transforme cada usuário em seu nome
    

    Resultado:

    ["Ana", "Marina"]
    

    Esse tipo de composição aparece bastante em front-end, back-end e APIs.

    • Você recebe dados.
    • Seleciona o que interessa.
    • Transforma no formato de que precisa.

    Cuidado quando find() não encontra nada

    Tem uma pegadinha importante.

    Veja:

    const usuario = usuarios.find(
    usuario => usuario.id === 99
    );
    

    Não existe usuário com id 99.

    Nesse caso, find() retorna:

    undefined
    

    Por isso, este código pode gerar um erro:

    console.log(usuario.nome);
    

    Uma opção é verificar antes:

    if (usuario) {
    console.log(usuario.nome);
    }
    

    Outra possibilidade é usar optional chaining quando fizer sentido:

    console.log(usuario?.nome);
    

    Esse detalhe parece pequeno. Mas é exatamente o tipo de coisa que aparece como bug quando começamos a trabalhar com dados reais.

    Então qual eu uso?

    Quando estiver olhando para um array, não tente lembrar primeiro da sintaxe.

    Pergunte o que você quer fazer.

    Quero transformar todos os itens?
    → map()
    
    Quero selecionar vários itens?
    → filter()
    
    Quero encontrar um único item?
    → find()
    

    Vamos testar com produtos:

    const produtos = [
    { id: 1, nome: "Teclado", preco: 200 },
    { id: 2, nome: "Mouse", preco: 80 },
    { id: 3, nome: "Monitor", preco: 1200 }
    ];
    

    Quero apenas os nomes?

    const nomes = produtos.map(
    produto => produto.nome
    );
    

    Quero produtos acima de R$ 100?

    const caros = produtos.filter(
    produto => produto.preco > 100
    );
    

    Quero o produto com id 2?

    const produto = produtos.find(
    produto => produto.id === 2
    );
    
    • Três perguntas.
    • Três métodos.
    • Três intenções diferentes.

    O que vale decorar

    Não decore map(), filter() e find() como três pedaços isolados de sintaxe. Decore as perguntas.

    • Quero transformar? map().
    • Quero selecionar? filter().
    • Quero encontrar? find().

    Quando você aprende a pergunta certa, o método costuma aparecer sozinho. Esse é um salto importante para quem está começando a programar: deixar de escolher código porque “já viu alguém usando” e começar a escolher porque sabe exatamente o que precisa acontecer.

    Continue aprendendo comigo

    Se este artigo te ajudou, compartilhe com outro dev que ainda mistura map(), filter() e find(). E me acompanhe no LinkedIn para mais conteúdos sobre JavaScript, desenvolvimento fullstack e conceitos que fazem diferença no código do dia a dia.

    #JavaScript #DesenvolvimentoWeb #Programacao

    Referências

    MDN Web Docs — Array.prototype.map()

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

    MDN Web Docs — Array.prototype.filter()

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

    MDN Web Docs — Array.prototype.find()

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

    Compartilhe
    Comentários (0)