Métodos de array

Você tem uma lista de preços e quer uma segunda lista com imposto adicionado a cada um. Você poderia escrever um loop for que percorre o array, faz a soma e adiciona cada resultado em um novo array. Isso funciona, mas é muito código para uma ideia simples: pegue cada item e mude-o. Métodos de array são as ferramentas built-in exatamente para esse tipo de trabalho. Eles permitem dizer o que você quer fazer com uma lista sem detalhar o loop que faz isso, e este capítulo cobre aqueles que você vai usar diariamente. Eles se baseiam diretamente em arrays e funções, então mantenha ambos à mão.
map: mude cada item
map é um método: uma função que pertence a um array e faz um trabalho nele. map constrói um novo array executando cada item através de uma pequena função que você passa, e coleta os resultados. Você passa essa função para ele, e ele entrega cada item um de cada vez.
Digamos que você tenha alguns preços e queira cada um duplicado:
const prices = [2, 4, 6];
const doubled = prices.map((price) => price * 2);
console.log(doubled); // [4, 8, 12]A parte (price) => price * 2 é uma função arrow: uma função curta que pega um item (price) e retorna o que deveria se tornar (price * 2). map chama uma vez por item e coloca cada resposta no novo array, na mesma ordem.
map pega uma lista e lhe dá uma nova do mesmo comprimento, com cada item executado através da sua pequena função. A função arrow diz em que cada item se transforma, e map faz isso com todos eles em ordem. Use-a sempre que se vir escrevendo um loop apenas para construir uma segunda lista. filter: mantenha os itens que passam
Onde map muda cada item, filter mantém apenas alguns deles. Você passa uma função que responde sim ou não para cada item, e filter constrói um novo array apenas com os itens que receberam um sim.
const scores = [40, 75, 90, 55, 88];
const passing = scores.filter((score) => score >= 60);
console.log(passing); // [75, 90, 88]A função (score) => score >= 60 retorna true ou false para cada pontuação. filter mantém aqueles onde é true e descarta o resto. O novo array pode ser mais curto que o original, e nunca muda a ordem.
filter mantém os itens que passam em um teste e descarta o resto, então o novo array é frequentemente mais curto. Sua função responde sim ou não para cada item, e apenas os sins vêm através. Nunca reordena nada, então o que sobrevive fica na ordem em que começou. reduce: reduza a um valor único
map e filter ambos lhe devolvem um array. reduce é aquele que colapsa um array em um valor único: um total, um máximo, uma string unida. Ele confunde mais pessoas que os outros, então vale a pena ir devagar.
reduce percorre o array enquanto carrega um resultado em execução junto com ele. A cada item ele pergunta: dado o resultado até agora e este item, qual é o novo resultado?
const prices = [10, 20, 30];
const total = prices.reduce((sum, price) => sum + price, 0);
console.log(total); // 60A função recebe duas coisas: sum, o total em execução até agora, e price, o item atual. Ela retorna sum + price, que se torna o novo total em execução para o próximo item. O 0 no final é onde o total começa. Então vai 0 + 10, depois 10 + 20, depois 30 + 30, chegando a 60.
reduce carrega um resultado em execução através da lista e o atualiza a cada item. O callback recebe o resultado até agora mais o item atual, e retorna o novo resultado. O último argumento é onde você começa, geralmente 0 para um total, e este clicou para mim no momento em que o li em voz alta passo a passo. find, some, e every
Esses três são parentes próximos de filter: eles executam um teste sobre o array, mas em vez de um novo array eles respondem uma questão mais estreita.
find lhe dá o primeiro item que passa no teste, não uma lista de todos eles. some e every respondem questões verdadeiro-ou-falso sobre o array inteiro.
const scores = [40, 75, 90, 55];
const firstPass = scores.find((score) => score >= 60);
console.log(firstPass); // 75
const anyPass = scores.some((score) => score >= 60);
console.log(anyPass); // true
const allPass = scores.every((score) => score >= 60);
console.log(allPass); // falsefind retorna o primeiro item correspondente (75). some pergunta "algum item passou?" e retorna true porque pelo menos um passou. every pergunta "todos passaram?" e retorna false porque 40 e 55 não passaram.
find lhe dá o primeiro item que passa, não uma lista inteira. some pergunta "algum passou?" e every pergunta "todos passaram?", e ambos respondem com true ou false. Use estes quando você quiser um item ou uma resposta sim-ou-não, não um array filtrado. Encadeamento e mantendo legibilidade
Os métodos acima compartilham um design que compensa uma vez que você os combina: cada um retorna um novo valor e deixa o array original intocado.
map, filter e o resto nunca mudam o array com o qual você começou. Eles lhe dão um novo array (ou um valor) e deixam o original sozinho.
const prices = [10, 20, 30];
const doubled = prices.map((price) => price * 2);
console.log(doubled); // [20, 40, 60]
console.log(prices); // [10, 20, 30]Porque map e filter ambos devolvem um array, você pode alinhá-los: filtre primeiro, depois mapeie os sobreviventes.
const prices = [10, 20, 30, 40];
const bigDoubled = prices.filter((price) => price >= 20).map((price) => price * 2);
console.log(bigDoubled); // [40, 60, 80]filter e map ambos retornam arrays, você pode encadeá-los: filtre primeiro, depois mapeie o que sobrou. Leia a cadeia de cima para baixo, um passo de cada vez. Para onde ir daqui
map, filter e reduce cobrem a maioria do que você fará com uma lista: transforme-a, estreite-a ou reduza-a. find, some e every respondem as questões mais estreitas. Uma vez que estes se sintam naturais, a maioria dos seus loops for sobre um array vira uma linha ou duas que diz o que você pretendia.
O próximo passo natural é objetos, onde arrays começam mantendo itens mais ricos que números e strings simples, e esses mesmos métodos continuam funcionando neles. Se qualquer da sintaxe de callback aqui se sentiu instável, uma passagem de volta através de funções faz o resto clicar em lugar.

