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.