Higher-Order Functions: Como filter, map e reduce mudaram minha forma de pensar em código
Quando comecei a aprender JavaScript, minha solução para qualquer problema com arrays era sempre a mesma: um for loop. Funcionava, mas o código ficava longo, repetitivo e difícil de ler. Foi quando descobri as higher-order functions — e percebi que estava reinventando a roda toda vez.
O que é uma higher-order function?
Uma função de ordem superior é qualquer função que recebe outra função como parâmetro ou retorna uma função como resultado. Parece complexo, mas você provavelmente já fez isso sem perceber.
Quando você escreve:
numeros.filter(n => n > 2)
Você está passando uma função n => n > 2 como argumento para o filter. Isso é uma higher-order function.
O código que escondia o problema
Antes de conhecer essas funções, eu escrevia assim:
let resultado = []
for(let i = 0; i < numeros.length; i++){
if(numeros[i] > 2){
resultado.push(numeros[i])
}
}
Funciona. Mas olha quanto código apenas para filtrar números maiores que 2. E se eu precisasse fazer isso em 10 lugares diferentes do código?
As 7 funções que você precisa conhecer
forEach — percorrer sem criar array novo
Use quando quiser executar algo para cada item, sem precisar do resultado.
pets.forEach(pet => console.log(pet.nome))
map — transformar cada item
Use quando quiser criar um novo array transformando cada elemento.
// pegar só os nomes de uma lista de objetos
pets.map(pet => pet.nome)
// ["Fluffy", "Rex", "Bolt"]
filter — filtrar por condição
Use quando quiser criar um novo array com só os itens que passam num teste.
// só os pets com mais de 2 anos
pets.filter(pet => pet.idade > 2)
reduce — acumular em um único valor
Use quando quiser transformar um array em um único valor — soma, objeto, string.
// soma total das idades
pets.reduce((acc, pet) => acc + pet.idade, 0)
sort — ordenar
Use quando quiser ordenar o array. Para números, sempre passe a função de comparação.
pets.sort((a, b) => a.idade - b.idade)
every — todos passam?
Use quando quiser saber se todos os itens satisfazem uma condição. Retorna true ou false.
// todos os pets têm menos de 10 anos?
pets.every(pet => pet.idade < 10)
some — algum passa?
Use quando quiser saber se pelo menos um item satisfaz uma condição. Retorna true ou false.
// algum pet tem nome começando com R?
pets.some(pet => pet.nome.startsWith("R"))
O poder do encadeamento
O que torna essas funções ainda mais poderosas é que você pode encadeá-las — o resultado de uma vira a entrada da próxima.
// nomes em maiúsculo dos pets com mais de 2 anos, ordenados alfabeticamente
pets
.filter(pet => pet.idade > 2)
.map(pet => pet.nome.toUpperCase())
.sort()
Três operações, código limpo, sem variáveis intermediárias.
A lição que aprendi na prática
Em um dos meus desafios, precisava verificar se todos os objetos de uma coleção tinham uma propriedade com valor truthy. Escrevi isso:
let gav = []
let count = 0
for(let i = 0; i < collection.length; i++){
let porta = false
for(const collections of collection){
if(collections[pre]){
porta = true
}
}
if(porta){
count += 1
if(collection[i][pre]){
gav.push(collection[i][pre])
}
}
}
let arrCount = gav.length
let check = count % arrCount
if(check == 0){ return true } else { return false }
30 linhas. Funcionava. Mas quando lembrei do every, a solução ficou assim:
return collection.every(obj => obj[pre])
Uma linha. Mesma lógica. Isso é o que acontece quando você conhece as ferramentas certas.
Quando usar cada uma — guia rápido
Quer criar novo array transformado? → map
Quer criar novo array filtrado? → filter
Quer um único valor acumulado? → reduce
Quer percorrer sem retornar nada? → forEach
Quer verificar se TODOS passam? → every
Quer verificar se ALGUM passa? → some
Quer ordenar? → sort
Conclusão
Higher-order functions não são só uma forma mais elegante de escrever código — elas mudam como você pensa sobre problemas. Em vez de pensar “como eu itero sobre isso”, você passa a pensar “o que eu quero fazer com cada item”.
Essa mudança de perspectiva é o que separa código de iniciante de código profissional.