Já falamos sobre map, reduce e filter, hoje vou mostrar uma high-order function bem parecida chamada de find. Vamos aproveitar o exemplo do reduce:
const carrinho = [
{ id: 1, preco: 2, qtd: 2, estoque: 10 },
{ id: 1, preco: 3, qtd: 5, estoque: 2 }
]
const subtotal = (item) => item.preço * item.qtd
const filtroEmEstoque = (item) => item.estoque * item.qtd
const soma = (soma, subtotal) => subtotal + soma
const total = carrinho.filter(filtroEmEstoque).map(subtotal).reduce(soma, 0)
const produtoId1 = (item) => item.id === 1
const produtoId1Retorno = carrinho.find(produtoId1)
console.log(produtoId1Retorno)
Perceba que pedimos o produto com o id 1, mandamos procurar com o find no carrinho e buscamos esse ID 1. Uma coisa interessante e comum é fazermos como fizemos em cima, até meu filtro ser uma variável e apenas fazermos o retorno. Agora imaginem que a gente queira parametrizar ainda mais, um conceito bem legal é a seguinte:
const idEquals = (id, item) => item.id === id
const idEquals1 = carrinho.find(produtoId1)
console.log(produtoId1Retorno)
Perceba que eu fiz uma arrow function e nela estou passando o ID com o item que estou iterando. Quando for criar mais filtros, posso usar essa função de idEquals e fixar quem eu quero nesse primeiro parâmetro.
const idEquals = (id, item) => item.id === id
const idEquals1 = idEquals.bind(null, 1)
const idEquals1 = carrinho.find(produtoId1)
console.log(produtoId1Retorno)
Essa nova função que eu criei sempre terá um do ID fixo, então quando eu fizer:
console.log(carrinho.find(idEquals1)
Eu já sei que estou travando o ID em um, criando uma nova função a partir da função que eu já tinha. A vantagem disso é que vamos saindo de funções mais genéricas para funções mais específicas que também são fáceis de testar, deixando o código cada vez mais legível. Óbvio que esse exemplo é bem simples, mas poderíamos travar uma dependência com um banco, por exemplo.
Podemos usar o bind junto com find e qualquer outra função para travar algumas variáveis criando funções novas que travam alguns desses valores.
Confira o video:
o DevPleno no Facebook, inscreva-se no canal e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.