{"componentChunkName":"component---src-templates-blog-post-js","path":"/javascript-array-flatmap/","result":{"data":{"markdownRemark":{"fields":{"slug":"/javascript-array-flatmap/"},"frontmatter":{"title":"Explorando Javascript: Array FlatMap","description":"Nivelando arrays no javascript usando flat() e flatMap()","date":"20 de setembro de 2020","image":"/assets/img/screen-shot-2020-09-20-at-19.38.46.png"},"html":"<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 62.083333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAACHklEQVQoz3WTy2sTURTG81e5cC9uxH9BXLuRWsHHRrCbCNaFYlMxIFirYBXFR0gibRGhjS1FmzSvtmka00wzzWQyM5lkMq+fN6kpkxAvXObOued85/vOPSfEv+X7/tlX0zsozTaKaqK2OmiGhdl16Nk+4/7jKzS8HDq0dJOThkH/t/pHZbdYpyh2W4AapkssmWHrV5lgXBA8FMzmuC4nij5gJ9d1ZFmndtSifqwN7ldX05w7f5eLl2ep1dSBzfP8EcYjgLbjoLdNmmqbSlmhWmlSOVTYKx5j6BblA4nY4wfcuv4IWSSdxDI0Wg+fnaxEVbCSJA2p1hJMNLLCJglGuV2F8J15Ll0I8/5j9oxhEPQM0HW9gcPM/QRzc9/ppzg+MelYPQ4qDWqyyfaPDcIz77h9LUL8w/qpKtuZLHlomJ5a4OqVCIU9mSPZIpks8Dy6zsKrTZZerPJ2Pk40vMTMvc+s/6z2OeJ7ExgOAW9OPWP6RoSvibyoU5fMjopUNzDNNmapxOHGFi8jn/i2vMd+ycR27cmSPe9Ucmotz+zDBNtZhW6vQzanYnRESQSgVS6JBzOpi12tGeQLGq7nDFpsBDBYA0WxefqkSi5niOxd0hmVRDzF/tYm6c3fLEZf09R77B+0yOW1U8njgEHJ/cdpNCwxFZ7oS0f0ZI83i19IxpZJbaRZWUnhCr/+BKmqzXh8KDg2/xun8TUsz3hM//wXsLp+44TZF18AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"Desenho de uma mulher usando o computador e um quadro atras com os nomes dos métodos &quot;array.flat()&quot;, &quot;array.flatMap()&quot;\"\n        title=\"Desenho de uma mulher usando o computador e um quadro atras com os nomes dos métodos &quot;array.flat()&quot;, &quot;array.flatMap()&quot;\"\n        data-src=\"/static/c9b8442c3c3127c70ebf3c19d18e7a7c/d9199/screen-shot-2020-09-20-at-19.38.46.png\"\n        data-srcset=\"/static/c9b8442c3c3127c70ebf3c19d18e7a7c/8ff5a/screen-shot-2020-09-20-at-19.38.46.png 240w,\n/static/c9b8442c3c3127c70ebf3c19d18e7a7c/e85cb/screen-shot-2020-09-20-at-19.38.46.png 480w,\n/static/c9b8442c3c3127c70ebf3c19d18e7a7c/d9199/screen-shot-2020-09-20-at-19.38.46.png 960w,\n/static/c9b8442c3c3127c70ebf3c19d18e7a7c/07a9c/screen-shot-2020-09-20-at-19.38.46.png 1440w,\n/static/c9b8442c3c3127c70ebf3c19d18e7a7c/21cdd/screen-shot-2020-09-20-at-19.38.46.png 1680w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<ul>\n<li><a href=\"#cenario-simples\">Cenário simples</a></li>\n<li><a href=\"#metodo-flat\">Método flat()</a></li>\n<li><a href=\"#metodo-map\">Método map()</a></li>\n<li><a href=\"#metodo-flatmap\">Método flatMap()</a></li>\n</ul>\n<h2 id=\"cenario-simples\">Cenário simples</h2>\n<p>Em alguns momentos na vida de pessoa desenvolvedora, nos deparamos com casos em quem temos um array de coisas (objetos, strings, números), e as vezes temos <strong>arrays</strong> dentro de <strong>arrays</strong>.</p>\n<p>Exemplo com números:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> array <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token comment\">// array[0] = 1</span>\n<span class=\"token comment\">// array[1] = 2</span>\n<span class=\"token comment\">// array[2] = 3</span>\n<span class=\"token comment\">// array[3][1] = 4</span>\n<span class=\"token comment\">// array[3][2] = 5</span>\n<span class=\"token comment\">// array[3][3] = 6</span></code></pre></div>\n<p>E por alguma razão específica queremos nivelar todos esses valores, deixando os números num mesmo nível.</p>\n<h2 id=\"metodo-flat\">Método flat()</h2>\n<p>Com o método <code class=\"language-text\">flat()</code> conseguimos nivelar esse <strong>array</strong>, e todos eles ficam no mesmo nível.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> array <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">const</span> arrayFlatten <span class=\"token operator\">=</span> array<span class=\"token punctuation\">.</span><span class=\"token function\">flat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// valor de arrayFlatten:</span>\n<span class=\"token comment\">// [ 1, 2, 3, 4, 5, 6 ]</span></code></pre></div>\n<p>O método <code class=\"language-text\">flat()</code> sem parâmetros por padrão só nivela um nível (valor padrão = 1). Ou seja, se tivermos <strong>arrays</strong>, dentro de <strong>arrays</strong>, dentro de <strong>arrays</strong>.... pode se especificar o nível de profundidade que quer nivelar, ou apenas colocar o parâmetro <code class=\"language-text\">Infinity</code>, com isso independente do nível de \"profundidade\", os valores dos <strong>arrays</strong> vão estar no mesmo nível.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> array <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">7</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">,</span> <span class=\"token number\">9</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">11</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">const</span> arrayFlatten <span class=\"token operator\">=</span> array<span class=\"token punctuation\">.</span><span class=\"token function\">flat</span><span class=\"token punctuation\">(</span><span class=\"token number\">Infinity</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// valor de arrayFlatten:</span>\n<span class=\"token comment\">// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]</span></code></pre></div>\n<h2 id=\"metodo-map\">Método map()</h2>\n<p>O método <code class=\"language-text\">map()</code>, não tem nada a ver com nivelar arrays.</p>\n<p>Usamos o <code class=\"language-text\">map()</code> para percorrer <strong>arrays</strong>, aplicar alguma função em cada item do <strong>array</strong> e retornar um <strong>array</strong> de mesmo tamanho.</p>\n<blockquote>\n<p>💡 Já mostrei como usar o map nesse outro post que eu fiz: <a target=\"_blank\" href=\"https://blog.talitaoliveira.com.br/como-e-quando-usar-foreach-map-filter-reduce/\">Usando foreach(), map(), filter(), reduce()</a></p>\n</blockquote>\n<p>Mas recapitulando aqui:</p>\n<ul>\n<li>O <code class=\"language-text\">map()</code> retorna um novo <strong>array</strong> com o mesmo tamanho do array que foi percorrido</li>\n<li>Pra isso criamos uma constante para receber esse novo <strong>array</strong></li>\n<li>Recebe uma função que vai ser executada para cada item do <strong>array</strong></li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> frutas <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"banana\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"maçã\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"abacaxi\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"mamão\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"abacate\"</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> lembretes <span class=\"token operator\">=</span> frutas<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fruta</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Eu preciso comer mais </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>fruta<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>lembretes<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">/*\nApós executar, temos um array de ~frases com valores vindos do array de frutas:\n\n['Eu preciso comer mais banana',\n'Eu preciso comer mais maçã',\n'Eu preciso comer mais abacaxi',\n'Eu preciso comer mais mamão',\n'Eu preciso comer mais abacate']\n*/</span></code></pre></div>\n<h2 id=\"metodo-flatmap\">Método flatMap()</h2>\n<p>E o método <code class=\"language-text\">flatMap()</code> é basicamente a junção dos dois.</p>\n<p>Mas vamos a outro cenário, um <strong>array</strong> de objetos que será uma lista de pessoas e cada pessoa tem no mínimo 2 telefones cadastrados para ela. <strong>E queremos uma lista dos telefones de todas as pessoas.</strong></p>\n<p>Ao meu ver esse cenário tá um pouco mais próximo da realidade de como usar do que um simples array de números.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> pessoas <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">idade</span><span class=\"token operator\">:</span> <span class=\"token number\">20</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">nome</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Fulano 1\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">telefones</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"celular\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(81)9.9999-9999\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"casa\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(81)3444-4444\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">idade</span><span class=\"token operator\">:</span> <span class=\"token number\">27</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">nome</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Fulano 2\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">telefones</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"celular\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(84)9.8888-888\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"casa\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(84)3455-5555\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">idade</span><span class=\"token operator\">:</span> <span class=\"token number\">32</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">nome</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Fulano 3\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">telefones</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"celular\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(83)9.7777-7777\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"celular\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(83)9.6666-6666\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"casa\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(83)3466-6666\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>Para esse caso usamos o <code class=\"language-text\">flatMap()</code> no array de pessoas e a função que passamos para ele retorna os telefones.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> telefones <span class=\"token operator\">=</span> pessoas<span class=\"token punctuation\">.</span><span class=\"token function\">flatMap</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">pessoa</span> <span class=\"token operator\">=></span> pessoa<span class=\"token punctuation\">.</span>telefones<span class=\"token punctuation\">)</span></code></pre></div>\n<p>E o retorno de <strong>telefones</strong> fica assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"celular\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(81)9.9999-9999\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"casa\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(81)3444-4444\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"celular\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(84)9.8888-888\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"casa\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(84)3455-5555\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"celular\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(83)9.7777-7777\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"celular\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(83)9.6666-6666\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">tipo</span><span class=\"token operator\">:</span> <span class=\"token string\">\"casa\"</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">numero</span><span class=\"token operator\">:</span> <span class=\"token string\">\"(83)3466-6666\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<h2>Referência:</h2>\n<p><a target=\"_blank\" href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap\">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap</a></p>\n<p>~🌟~</p>\n<p>Bem.. é isso. 😉</p>\n<p>Houve a necessidade de usarmos o <code class=\"language-text\">flatMap()</code> semana passada, nunca tinha usado e na hora nas pressas não assimilei direito, aí passei por ele com calma e decidi mostrar nesse post como usar. 🙃</p>\n<p>Minha frequência de posts diminuiu um pouco nessas ultimas semanas basicamente por motivos de saúde mental, nada grave só organizando e analisando alguns pensamentos e atitudes, e pensando bastante sobre focos e objetivos da minha vida profissional e pessoal. Mas to suave. 🙃</p>\n<p>Espero que este post possa ser útil para alguém 😊.</p>\n<p>Até a próxima. 🤙🏽</p>","timeToRead":3}},"pageContext":{"slug":"/javascript-array-flatmap/","previousPost":{"fields":{"slug":"/exibindo-um-loader-para-uma-requisicao-no-react/"},"frontmatter":{"title":"Exibindo um Loader para uma requisição no React"}},"nextPost":{"fields":{"slug":"/react-capturando-erros-com-errorboundary/"},"frontmatter":{"title":"React: Capturando erros com ErrorBoundary"}}}},"staticQueryHashes":["1595325003","2037742868","764694655"]}