﻿{"id":259,"date":"2019-10-14T16:55:20","date_gmt":"2019-10-14T19:55:20","guid":{"rendered":"https:\/\/blog.softmakers.com.br\/?p=259"},"modified":"2020-04-23T16:58:53","modified_gmt":"2020-04-23T19:58:53","slug":"trabalhando-com-map-filter-reduce","status":"publish","type":"post","link":"https:\/\/blog.softmakers.com.br\/index.php\/2019\/10\/14\/trabalhando-com-map-filter-reduce\/","title":{"rendered":"Trabalhando com map, filter e reduce"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"> Entenda os comportamentos e funcionalidades, de forma Pr\u00e1tica e direta. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Map<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">O&nbsp;<strong>map<\/strong>&nbsp;\u00e9 um m\u00e9todo que executa um <strong>callback<\/strong> para cada valor de um <strong>array <\/strong>modificando os mesmos, isso faz com que o <strong>map<\/strong> crie um novo <strong>array<\/strong> com os novos valores obtidos.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando utilizar? <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando voc\u00ea quer que&nbsp;<strong>o resultado seja um \u201carray\u201d com \u201co mesmo\u201d tamanho do \u201carray\u201d inicial<\/strong>, por\u00e9m&nbsp;<strong>com valores modificados (ou n\u00e3o).<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\nFunciona da seguinte maneira:\n\n<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>recebe 1 elemento do&nbsp;<strong>array. <\/strong> <\/li><li>executa a fun\u00e7\u00e3o passada.<ul><li> \u0096adiciona esse elemento no&nbsp;<strong>array<\/strong>&nbsp;de resposta. <\/li><\/ul><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Aplica\u00e7\u00e3o B\u00e1sica<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const array = ['values'];\n\nconst arrayResp = array.map(function(value){\n\t\/\/...Aqui \u00e9 aplicado o C\u00f3digo de execu\u00e7\u00e3o que retorna a intera\u00e7\u00e3o para o arrayResp.\n});\n\nconsole.log(arrayResp);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplo 1: B\u00e1sico<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">let list = [1,2,3].map(function(value){\n\treturn value * 2;\n});\n\nconsole.log(list); \/\/[2, 4, 6]<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Basicamente o m\u00e9todo este percorrendo o array e fazendo a multiplica\u00e7\u00e3o de cada valor por 2, e a cada soma o resultado \u00e9 adicionado a vari\u00e1vel <strong>list<\/strong>, tendo por fim a impress\u00e3o no console o <strong>array<\/strong> [2, 4, 6].<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplo 2: Com Arrow Functions<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const list = [1,2,3];\n\nlet multipliedByTwo = list.map(x => x * 2);\n\nconsole.log(multipliedByTwo); \/\/[2, 4, 6]<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Neste exemplo temos o mesmo processo do exemplo anterior, com algumas modifica\u00e7\u00f5es e a utiliza\u00e7\u00e3o do <em><strong><a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Functions\/Arrow_functions\">Arrow functions<\/a><\/strong><\/em>,   desta forma podemos ter um c\u00f3digo mais curto (limpo) sem perder a ess\u00eancia. <\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplo 3: Com Promises<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const list = [1,2,3];\nlet multipliedByTwo = [];\n\nconst functionWithPromise = item => {\n\treturn Promise.resolve(item * 2);\n}\n\nconst anAsyncFunction = async item => {\n\treturn await functionWithPromise(item);\n}\n\nconst getData = async () => {\n\tmultipliedByTwo.push(\n\t\tawait Promise.all(\n\t\t\tlist.map(item => anAsyncFunction(item))\n\t\t)\n\t);\n\treturn multipliedByTwo[0];\n}\n\nasync function result(){\n\tconsole.log(await getData());\n}\n\nresult(); \/\/ [2 ,4, 6]<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li> Agora Observamos um exemplo mais trabalhado, utilizando <a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Promise\"><strong>Promises<\/strong><\/a>, simplificando, o <strong>map<\/strong> \u00e9 executado dentro do escopo da Promises.all, neste formato o <strong>map<\/strong> \u00e9 completamente executado e retorna um <strong>array<\/strong> com os valor somados, depois \u00e9 feito o <em><strong>&#8220;push&#8221;<\/strong><\/em> para o vari\u00e1vel <strong>multipliedByTwo<\/strong>, ou seja, \u00e9 obtido um array e aplicado dentro do outro, por este motivo o retorno da fun\u00e7\u00e3o <strong><em>getData<\/em><\/strong> esta &#8220;pegando&#8221; o item <em>[0]<\/em>,   imprimindo por fim o mesmo resultado dos exemplos anteriores.<\/li><\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>NOTA:<\/p><p> O m\u00e9todo&nbsp;<code>map<\/code>&nbsp;n\u00e3o modifica o array original. No entanto, a fun\u00e7\u00e3o&nbsp;<code>callback<\/code>&nbsp;invocada por ele pode faz\u00ea-lo. <\/p><cite>Refer\u00eancia:  <a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/map\">https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/map<\/a> <\/cite><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Filter<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Como o nome j\u00e1 diz essa <strong>fun\u00e7\u00e3o<\/strong> server para <strong>filtrar elementos<\/strong> de um&nbsp;<strong>array<\/strong>&nbsp;para um novo. O&nbsp;<strong>filter<\/strong>&nbsp;assim como o&nbsp;<strong>map<\/strong>, e outros, tamb\u00e9m \u00e9 um&nbsp;<strong>Functor<\/strong>&nbsp;logo n\u00e3o modificar\u00e1 nosso&nbsp;<strong>array<\/strong>&nbsp;original. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando utilizar? <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando voc\u00ea quer que&nbsp;<strong>o resultado seja um \u201carray\u201d com o tamanho menor (ou n\u00e3o) que o \u201carray\u201d inicial<\/strong>, por\u00e9m&nbsp;<strong>\u201dapenas\u201d com valores que passaram por um teste l\u00f3gico.<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Funciona da seguinte maneira: <\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>recebe 1 elemento do&nbsp;<strong>array<\/strong>.<\/li><li>executa a fun\u00e7\u00e3o passada.<ul><li> \u0096caso o retorno seja&nbsp;<strong>true<\/strong>.<ul><li>adiciona esse elemento no&nbsp;<strong>array<\/strong>&nbsp;de resposta.<\/li><\/ul><\/li><li> \u0096caso o retorno seja&nbsp;<strong>false.<\/strong><ul><li><strong> N\u00c3O<\/strong>&nbsp;adiciona esse elemento no&nbsp;<strong>array<\/strong>&nbsp;de resposta.<\/li><\/ul><\/li><\/ul><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Aplica\u00e7\u00e3o B\u00e1sica<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const array = ['values'];\n\nconst result = array.filter(\"\/\/...Aqui \u00e9 aplicado o C\u00f3digo de execu\u00e7\u00e3o que retorna o resultado que for 'true' para o result.\");\n\nconsole.log(result);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplos Simples utilizando Arrow Functions<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const list = [1, 5, 9, 8, 2, 10, 3, 4];\n\nlet greaterThanFive = list.filter(number => {return number > 5});\n\nconsole.log(greaterThanFive) \/\/[9, 8, 10]<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>No exemplo acima \u00e9 aplicado o <em><strong><a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Functions\/Arrow_functions\">Arrow functions<\/a><\/strong><\/em> dentro do escopo do <strong>filter<\/strong> retornando apenas os n\u00fameros maiores que 5, criando um novo <strong>array <\/strong>na vari\u00e1vel <strong>greaterThanFive<\/strong>.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplos Simples utilizando Arrow Functions e If tern\u00e1rio:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const list = [1, 5, 9, 8, 2, 10, 3, 4];\n\nlet oddNumbers = list.filter(number => (number % 2 == 1 ? true : false));\n\nconsole.log(oddNumbers) \/\/[1, 5, 9, 3]<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Neste exemplo junto com o Arrow functions, tamb\u00e9m esta aplicado o <em><strong><a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Operators\/Operador_Condicional\">if tern\u00e1rio<\/a> <\/strong><\/em>dentro do mesmo escopo do <strong>filter<\/strong> retornando apenas os n\u00fameros \u00edmpares, criando um novo <strong>array <\/strong>na vari\u00e1vel  <strong>oddNumbers.<\/strong><\/li><\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>NOTA: <\/p><p> <code>filter<\/code> n\u00e3o altera o&nbsp;<code>array<\/code>&nbsp;a partir da qual foi invocado. <\/p><cite> Refer\u00eancia:  <a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/filtro\">https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/filtro<\/a> <\/cite><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Reduce<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">M\u00e9todo que executa uma&nbsp;fun\u00e7\u00e3o de&nbsp;<strong>redutor<\/strong>&nbsp;(que voc\u00ea fornece) em cada elemento da matriz, resultando em um \u00fanico valor de sa\u00edda. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando utilizar?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando voc\u00ea quer que&nbsp;<strong>o resultado seja um \u201carray\u201d (ou qualquer outro tipo existente) <\/strong>e seu(s) o(s) valor(es) pode(m) ser de <strong>qualquer tipo<\/strong>. <br>Ainda pode-se falar que quando precisa iterar o mesmo <strong>array<\/strong> usando <strong>filter<\/strong> e <strong>map<\/strong>, ao inv\u00e9s de faz\u00ea-lo duas vezes, o <strong>reduce<\/strong>, mesmo sendo mais complexo, \u00e9 uma op\u00e7\u00e3o para isso. Dentro dele d\u00e1 para em uma intera\u00e7\u00e3o fazer o que \u00e9 preciso de um <strong>filter<\/strong> e um <strong>map<\/strong>. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Funciona da seguinte maneira:<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>A&nbsp;fun\u00e7\u00e3o de&nbsp;<strong>redutor<\/strong>&nbsp;usa quatro argumentos: \u0096<ul><li>Acumulador (acc)<\/li><li> \u0096Valor Atual (cur)<\/li><li> \u0096\u00cdndice atual (idx) <\/li><li>\u0096Matriz de Origem (src) <\/li><\/ul><\/li><li>O valor retornado da&nbsp;sua&nbsp;fun\u00e7\u00e3o&nbsp;<strong>redutor<\/strong>&nbsp;\u00e9 atribu\u00eddo ao <strong>acumulador<\/strong>, cujo valor \u00e9 lembrado <strong>em cada itera\u00e7\u00e3o<\/strong> em todo o <strong>array<\/strong> e, finalmente, torna-se o valor resultante final \u00fanico.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Aplica\u00e7\u00e3o B\u00e1sica<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const array = ['values'];\n\nconst result = array.reduce(function(accumulator, currentValue){\n\t\/\/... Aqui \u00e9 aplicado o C\u00f3digo de execu\u00e7\u00e3o que retorna o resultado para o result.\n});\n\nconsole.log(result);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>Exemplos Simples utilizando Arrow Functions<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const list = [1, 2, 3, 4];\n\nconst totalSum = list.reduce((accumulator, currentValue) => {\n\treturn accumulator + currentValue;\n});\n\nconsole.log(totalSum); \/\/10<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>No exemplo acima o <strong>reduce<\/strong> executa a soma de todas as intera\u00e7\u00f5es, retornando o valor a soma total na vari\u00e1vel <strong>totalSum<\/strong>, explicado com mais detalhes no pr\u00f3ximo exemplo.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const list = [1, 2, 3, 4];\n\nconst reducer = (accumulator, currentValue) => accumulator + currentValue;\n\nconsole.log(list.reduce(reducer)); \/\/10\n\nconsole.log(list.reduce(reducer, 5)); \/\/15<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>No exemplo acima foi criada a fun\u00e7\u00e3o <strong>reducer<\/strong>, com os par\u00e2metros <strong>accumulator<\/strong> &amp; <strong>currentValue<\/strong>, onde temos a aplica\u00e7\u00e3o da fun\u00e7\u00e3o interna do <strong>reduce<\/strong>, desta forma trabalhamos de uma forma mais abrangente.<br><br>1 &#8211; Observamos que no primeiro console,  passamos apenas como par\u00e2metro a fun\u00e7\u00e3o <strong>reducer,<\/strong> isso porque no m\u00e9todo <strong>reduce<\/strong> o seu primeiro par\u00e2metro \u00e9 um acumulador, desta forma a primeira intera\u00e7\u00e3o apenas o acumulador \u00e9 preenchido, ou seja, no <strong>reducer<\/strong> o par\u00e2metro (vari\u00e1vel) <strong>accumulator<\/strong>, recebe o valor inicial e fica aguardando os demais valores, do segundo em diante, <em>&#8220;se existir<\/em>&#8220;, os valores s\u00e3o colocados no par\u00e2metro (vari\u00e1vel) <strong>currentValue<\/strong>, somando o  <strong>accumulator<\/strong>  com o <strong>currentValue<\/strong> , at\u00e9 chegar a ultima intera\u00e7\u00e3o, por fim imprimindo no console o valor final, neste caso <strong><em>&#8220;10&#8221;<\/em><\/strong>.<br><br>2 &#8211; No Segundo Console observamos que diferente do primeiro s\u00e3o passados dois par\u00e2metro no m\u00e9todo <strong>reduce<\/strong>, como explicado no primeiro console, o m\u00e9todo <strong>reduce<\/strong> tem como primeiro par\u00e2metro um acumulador, certo, mais se o primeiro \u00e9 um acumulador, como \u00e9 que ele trabalha passando 2 par\u00e2metro?, Isto se da por conta de sua estrutura original, na verdade, o <strong>reduce<\/strong> recebe valores impl\u00edcitos, assim como no primeiro console ele recebe a fun\u00e7\u00e3o <strong>reducer<\/strong>, que sua estrutura s\u00e3o dois par\u00e2metro,  neste caso ele recebe a mesma fun\u00e7\u00e3o, executa por inteiro este primeiro par\u00e2metro <strong><em>&#8220;reducer&#8221;<\/em><\/strong>, que o retorno se torna o acumulador e tem como valor corrente o pr\u00f3ximo par\u00e2metro <strong><em>&#8220;5&#8221;<\/em><\/strong><em>,<\/em> por fim somando o acumulador com o valor corrente e imprimindo no console o resultado da soma <strong>&#8220;15&#8221;.<\/strong>  <\/li><\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>NOTA:<\/p><p> Se o&nbsp;<code>valorInicial<\/code>&nbsp;n\u00e3o tiver sido&nbsp;passado como&nbsp;argumento, ent\u00e3o&nbsp;<code>Acumulador<\/code><br>&nbsp;ser\u00e1 igual ao primeiro valor no array e&nbsp;<code>valorAtual<\/code>&nbsp;ser\u00e1&nbsp;igual ao segundo. <\/p><cite>Refer\u00eancia:  <a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/Reduce\">https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/Reduce<\/a> <\/cite><\/blockquote>\n\n\n\n<h4 class=\"wp-block-heading\">Aten\u00e7\u00e3o:<\/h4>\n\n\n<p><!--EndFragment-->Todos os Tr\u00eas m\u00e9todos, <strong>map, filter e reduce<\/strong>, s\u00f3 funciona com <strong>array<\/strong>, mais existem particularidades que dever\u00e3o ser <em><strong>&#8220;SEMPRE&#8221;<\/strong><\/em> levadas em considera\u00e7\u00f5es.<br>1 &#8211; Garanta &#8220;<em><strong>SEMPRE&#8221;<\/strong><\/em> que ser\u00e1 um <strong>array<\/strong> que chamar\u00e1 os m\u00e9todos:<\/p>\n<ul>\n<li>Se n\u00e3o for um <strong>array<\/strong>, ser\u00e1 executado uma exce\u00e7\u00e3o de erro que por sua vez quebra todo o processo.<\/li>\n<\/ul>\n<p>2 &#8211; O <strong>Array<\/strong> pode ser Vazio?<\/p>\n<ul>\n<li>Para o <strong>map <\/strong>&amp; <strong>filter<\/strong> se o <strong>array<\/strong> tiver vazio, os m\u00e9todos retornar\u00e3o um array vazio.<\/li>\n<li>Para o <strong>reduce<\/strong>, se o <strong>array <\/strong>tiver vazio, o m\u00e9todo executa uma exce\u00e7\u00e3o do erro, quebrando todo o processo, desta forma \u00e9 de suma import\u00e2ncia que ao ser utilizado o m\u00e9todo <strong>reduce<\/strong>, que seja garantido que o array tenha no m\u00ednimo um Valor, ou seja, \u00e9 necess\u00e1rio <b>Sempre <\/b>testar se o <b>array<\/b><b> origem n\u00e3o esta vazio<\/b>, pois o <strong>r<\/strong><b>educe<\/b> s\u00f3 funciona se o <b>array<\/b><b> origem <\/b>tiver amenos um valor.<\/li>\n<\/ul>\n\n\n<p class=\"wp-block-paragraph\"> <strong>Exemplos Simples para o teste:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">let list;\n\/\/ ou\nlet list = [];\n\nconst result = Array.asArray(list) &amp;&amp; list.length > 0 \n\t? list.reduce((accumulator, currentValue) => accumulator + currentValue)\n\t: 0\n\t\nconsole.log(result) \/\/0<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>O teste pode ser feito de v\u00e1rias formas, no exemplo acima, foi propositalmente aplicado um <em><strong>&#8220;if tern\u00e1rio&#8221;<\/strong><\/em> para garantir um valor de retorno, mais podemos apenas criar um <em><strong>&#8220;if&#8221;<\/strong> padr\u00e3o <\/em>executando (no caso do <strong>reduce<\/strong>) se for um array e n\u00e3o estiver vazio, para o <strong>map <\/strong>&amp;<strong> filter<\/strong> n\u00e3o se faz necess\u00e1rio testar se esta vazio, como explicado acima.<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplos Utilizando emoji:<\/h4>\n\n\n\n<figure class=\"wp-block-image alignwide\"><img fetchpriority=\"high\" decoding=\"async\" width=\"756\" height=\"425\" src=\"https:\/\/blog.softmakers.com.br\/wp-content\/uploads\/2019\/10\/image.png\" alt=\"\" class=\"wp-image-274\" srcset=\"https:\/\/blog.softmakers.com.br\/wp-content\/uploads\/2019\/10\/image.png 756w, https:\/\/blog.softmakers.com.br\/wp-content\/uploads\/2019\/10\/image-300x169.png 300w, https:\/\/blog.softmakers.com.br\/wp-content\/uploads\/2019\/10\/image-230x129.png 230w, https:\/\/blog.softmakers.com.br\/wp-content\/uploads\/2019\/10\/image-350x197.png 350w, https:\/\/blog.softmakers.com.br\/wp-content\/uploads\/2019\/10\/image-480x270.png 480w\" sizes=\"(max-width: 756px) 100vw, 756px\" \/><figcaption>fonte: <a href=\"https:\/\/www.google.com\/imgres?imgurl=https%3A%2F%2Fwww.lambda3.com.br%2Fwp-content%2Fuploads%2F%2F2017%2F01%2Fmap-filter-reduce-in-emoji-1.png&amp;imgrefurl=https%3A%2F%2Fwww.lambda3.com.br%2F2017%2F01%2Fmap-filter-reduce-javascript%2F&amp;docid=5GjgSsNgdzCxcM&amp;tbnid=seJeFphRkKTmAM%3A&amp;vet=10ahUKEwjWvaOO6ZzlAhWpIbkGHezrCVcQMwhEKAEwAQ..i&amp;w=836&amp;h=508&amp;bih=625&amp;biw=1366&amp;q=map%20filter%20reduce%20emoji&amp;ved=0ahUKEwjWvaOO6ZzlAhWpIbkGHezrCVcQMwhEKAEwAQ&amp;iact=mrc&amp;uact=8\">https:\/\/google.com.br\/imghp<\/a><\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplos Utilizando frutas:<\/h4>\n\n\n\n<figure class=\"wp-block-image alignwide\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/max\/785\/1*yD7P1I36G1jTProLQwEXxA.jpeg\" alt=\"Imagem relacionada\"\/><figcaption>fonte: <a href=\"https:\/\/www.google.com\/imgres?imgurl=https%3A%2F%2Fwww.lambda3.com.br%2Fwp-content%2Fuploads%2F%2F2017%2F01%2Fmap-filter-reduce-in-emoji-1.png&amp;imgrefurl=https%3A%2F%2Fwww.lambda3.com.br%2F2017%2F01%2Fmap-filter-reduce-javascript%2F&amp;docid=5GjgSsNgdzCxcM&amp;tbnid=seJeFphRkKTmAM%3A&amp;vet=10ahUKEwip1arG6ZzlAhUhGbkGHYccA88QMwhEKAEwAQ..i&amp;w=836&amp;h=508&amp;bih=625&amp;biw=1366&amp;q=map%20filter%20reduce%20emoji&amp;ved=0ahUKEwip1arG6ZzlAhUhGbkGHYccA88QMwhEKAEwAQ&amp;iact=mrc&amp;uact=8#h=508&amp;imgdii=ry4bd9GIH0B7kM:&amp;vet=10ahUKEwip1arG6ZzlAhUhGbkGHYccA88QMwhEKAEwAQ..i&amp;w=836\">https:\/\/google.com\/imghp<\/a><\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplos com a aplica\u00e7\u00e3o dos tr\u00eas m\u00e9todos em conjunto:<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const products = [{ id: 1, nome: 'prod 1'},\n\t\t\t\t{ id: 1, nome: 'prod 1'},\n\t\t\t\t{ id: 1, nome: 'prod 1'}]\n\t\t\t\t  \nconst purchaseRequests = [{ id: 10, idProd: 1, value: 10},\n\t\t\t\t\t\t{ id: 11, idProd: 3, value: 20},\n\t\t\t\t\t\t{ id: 12, idProd: 2, value: 40},\n\t\t\t\t\t\t{ id: 13, idProd: 3, value: 30}]\n\nlet arrayResponse = {}\n\nconst reducer = (accumulator, currentValue) => accumulator = currentValue\n\nconst calculate = (array, value) => {\n\tarray.push(value)\n\t\n\tlet totalValue = array.reduce(reducer)\n\t\n\tlet priceAverage = totalValue \/ array.length\n\t\n\treturn ([`amount : ${array.length}, priceAverage : ${priceAverage}, totalValue : ${totalValue}`])\n}\n\nconst result = () => {\n\ttry{\n\t\tproducts.map(value => {\n\t\t\tlet values = [];\n\t\t\t(purchaseRequests.filter(request => {\n\t\t\t\trequest.idProd === value.id\n\t\t\t\t\t? arrayResponse[request.idProd] = calculate(values,request.value)\n\t\t\t\t\t: 0\t\t\t\t\t\n\t\t\t\t})\n\t\t\t)\n\t\t})\n\t\treturn arrayResponse\n\t}catch(e){\n\t\treturn e\n\t}\n}\n\nconsole.log(result())\n\n\/* { '1': ['amount : 1, priceAverage: 10, totalValue : 10'],\n\t'2': ['amount : 1, priceAverage: 40, totalValue : 40'],\n\t'3': ['amount : 2, priceAverage: 25, totalValue : 50']} *\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para finalizar deixo o exemplo acima, analise, tire suas pr\u00f3prias conclus\u00f5es e at\u00e9 o pr\u00f3ximo Post!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Entenda os comportamentos e funcionalidades, de forma Pr\u00e1tica e direta. Map O&nbsp;map&nbsp;\u00e9 um m\u00e9todo que executa um callback para cada valor de um array modificando os mesmos, isso faz com que o map crie um novo array com os novos valores obtidos. Quando utilizar? Quando voc\u00ea quer que&nbsp;o resultado seja um \u201carray\u201d com \u201co mesmo\u201d &hellip; <a href=\"https:\/\/blog.softmakers.com.br\/index.php\/2019\/10\/14\/trabalhando-com-map-filter-reduce\/\" class=\"more-link\">Continuar lendo <span class=\"screen-reader-text\">Trabalhando com map, filter e reduce<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":263,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[45,46,40,43,41,48,49,42,47],"class_list":["post-259","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-coding","tag-async","tag-await","tag-filter","tag-json","tag-map","tag-node","tag-nodejs","tag-promise","tag-reduce"],"_links":{"self":[{"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/posts\/259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=259"}],"version-history":[{"count":18,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/posts\/259\/revisions"}],"predecessor-version":[{"id":452,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/posts\/259\/revisions\/452"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/media\/263"}],"wp:attachment":[{"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}