All for Joomla All for Webmasters
JavaScript

Simplificando no JavaScript: o uso de .map(), .reduce() e .filter()

Se você está começando em JavaScript, talvez não tenha ouvido falar em .map(), .reduce() e .filter(). Por questões de compatibilidade (Internet Explorer 8 não dava suporte), esses métodos começaram a ser amplamente utilizados há não muito tempo. Mas se você não precisa oferecer compatibilidade com esse navegador muito antigo, deve se familiarizar com eles. PS: Este artigo provavelmente se aplica a qualquer outra linguagem de programação que você esteja usando, pois esses são conceitos não exclusivos de JavaScript.

.map()

Deixe-me explicar como isso funciona com um exemplo simples. Digamos que você tenha recebido uma matriz contendo vários objetos – cada um representando uma pessoa. O que você realmente precisa no final, porém, é um array contendo apenas o id.

Existem várias maneiras de fazer isso. Você pode utilizar os métodos de iteração .forEach(), .for (… of) ou um simples .for() para recuperar o valor do atributo. Vamos analisar:

Observe que você tem que criar um array vazio de antemão. Utilizando o .map():

Podemos ser ainda mais concisos com a sintaxe inline (requer suporte ES6, Babel ou TypeScript):

Então, como o .map() funciona? callback passado como parâmetro é executado para cada valor no array e retorna cada novo valor no array resultante. Lembre-se de que o array resultante sempre terá o mesmo comprimento do array original.

.reduce()

Assim como o .map(), .reduce() também executa um callback para cada elemento de um array. A diferença aqui é que o .reduce() passa o resultado desse callback (o acumulador) de um elemento para o outro. O acumulador pode ser de praticamente qualquer tipo (inteiro, string, objeto, etc.) e deve ser instanciado ou passado ao chamar .reduce (). Vamos analisar com um exemplo. Digamos que você tenha uma série com esses pilotos e seus respectivos anos de experiência:

Supondo que precisamos saber o total de anos de experiência de todos eles. Com .reduce() é bem simples:

Observe que eu defini o valor inicial como 0. Eu também poderia ter usado uma variável existente, se necessário. Depois de executar o callback para cada elemento do array, o valor final será a redução do nosso acumulador (no nosso caso: 82). Vamos ver como isso pode ser reduzido com a sintaxe inline:

Agora, digamos que eu queira descobrir qual piloto é o mais experiente. Podemos usar o .reduce() também:

Neste caso, nomeei meu acumulador como oldest. Meu retorno de chamada compara o acumulador para cada piloto. Se um piloto tem mais anos de experiência do que o armazenado em oldest, então esse piloto se torna o novo mais antigo. Como você pode ver, usar .reduce() é uma maneira fácil de gerar um único valor ou objeto a partir de um array.

.filter()

E se você tiver um array, mas quiser selecionar apenas alguns dos elementos nela baseado em algum critério? É aí que entra .filter()! Aqui estão nossos dados:

Digamos que queremos dois arrays agora: uma para pilotos rebeldes e outra para pilotos do império. Com .filter() se torna incrívelmente fácil:

De forma ainda mais enxuta com a sintaxe inline:

Basicamente, se a função no callback retornar verdadeiro, o elemento atual estará no array resultante.

Combinando .map(), .reduce() e .filter()

Como os três méotods são chamados em array e como .map () e .filter () retornam arrays, podemos encadear facilmente nossas chamadas. Vejamos outro exemplo:

Nosso objetivo: obter a pontuação total apenas dos usuários da força. Vamos fazer passo a passo. Primeiro, precisamos filtrar  apenas o pessoal que pode usar a força:

Com isso, temos 3 elementos restantes em nosso array resultante. Agora precisamos criar um array contendo a pontuação total de cada Jedi:

Utilizando o .reduce() para obter o total:

E pra ficar divertido… podemos encadear todos esses passos em uma única chamada:

Enxugando a sintaxe:

Nota: No meu exemplo anterior, .map () e .filter () nem eram necessários. Poderíamos facilmente obter o mesmo resultado apenas com .reduce (). Mas utilizei todos pelo exemplo.

Map | Filter | Reduce – Javascript | Lambda3

Para ajudar a associar o propósito, retirado deste post

Se liga aí, porque é a hora da revisão!

Ainda que você possa usar as formas de iteração tradicionais, os métodos apresentados neste post ajudam a obter um resultado através de uma sintaxe menos verbosa e mais concisa. Tente substituir alguns dos seus loops em for com alguns .map(), .reduce() e .filter(), onde forem aplicáveis. O código ganha muito em legibilidade após se familiarizar. Quaisquer dúvidas, utilize a área de comentários ou entre em contato!

Nenhum Comentário

Deixe uma Resposta