JavaScript Map: Mapeando elementos de um array

Nesta documentação de JavaScript vamos conhecer o método map(), que pode ser usado para percorrer um vetor e obter uma representação específica para cada item nele contido.

Fique por dentro
A função map() é uma das mais utilizadas em JavaScript, tanto quanto for ou while, dada a imersão dessa linguagem no paradigma da programação funcional. Aprenda nessa documentação como utilizar essa função em seus códigos.

Nesta documentação de JavaScript conheceremos o método map(), do objeto Array, que nos permite percorrer um vetor e obter um novo array cujos itens são o resultado de uma função de callback que recebe como parâmetro cada item original. Por exemplo, podemos partir de um array de valores numéricos e obter um novo contendo o quadrado de cada item original.

A seguir podemos ver como funciona o método map().

JavaScript Map na prática

var numeros = [1, 2, 3, 4, 5]; //vetor original var quadrados = numeros.map(function(item){ return Math.pow(item, 2); //retorna o item original elevado ao quadrado }); document.write(quadrados); //imprime 1,4,9,16,25

Como funciona o map()?

O método map() é invocado a partir de um array e recebe como parâmetro uma função de callback, que é invocada para cada item e retorna o valor do item equivalente no array resultante. No exemplo acima, por exemplo, essa função de callback retorna o número original elevado ao quadrado. Na Figura 1 temos uma ilustração desse processo.

Figura 1. Funcionamento do método map()

Aqui é importante destacar que o método map() não modifica o array original, ele retorna um novo array com os itens resultantes do mapeamento.

Sintaxe

arrayOriginal.map(callback)

Parâmetros

callback é uma função que será executada para cada elemento no vetor original e retornará uma representação dele com base em alguma lógica, que será o item equivalente no vetor resultante. Sua estrutura é a seguinte:

function(valorAtual, indice, array)

Valor de retorno

É retornado um novo array cujos itens são uma representação dos elementos do array original.

Exemplos de uso do método map()

Exemplo 1

No exemplo a seguir mapeamos um array de objetos e retornamos apenas uma propriedade de cada item:

var vencedores = [ { nome : "Equipe Super", pais : "Brasil" }, { nome : "Time Maximo", pais : "EUA" }, { nome : "Mega Grupo", pais : "Canadá" } ]; var podioPorPais = vencedores.map(function(item, indice){ return item.pais; }); document.write(podioPorPais);

O resultado é: Brasil,EUA,Canadá.

Execute o código

Exemplo 2

Neste segundo exemplo partiremos do mesmo array visto no exemplo anterior, mas exibiremos os dados das equipes vencedoras em uma tabela. Para isso haverá um elemento table na página com a seguinte estrutura:

<table id="tbPodio"> <thead> <tr> <th>Posição</th> <th>Nome</th> <th>País</th> </tr> </thead> <tbody> </tbody> </table>

Em seguida podemos percorrer o array de vencedores e obter, para cada item, sua representação já na forma de uma linha da tabela:

var vencedores = [ { nome : "Equipe Super", pais : "Brasil" }, { nome : "Time Maximo", pais : "EUA" }, { nome : "Mega Grupo", pais : "Canadá" } ]; var podioPorPais = vencedores.map(function(item, indice){ return `<tr> <td>${indice + 1}</td> <td>${item.nome}</td> <td>${item.pais}</td> </tr>`; }); document.querySelector("#tbPodio tbody").innerHTML = podioPorPais.join("");

O resultado aqui é a tabela preenchida, como mostra a Figura 2.

Figura 2. Tabela preenchida com os itens
Execute o código

Exemplo 3

Neste próximo exemplo temos um array de produtos com seus respectivos preços de venda e desejamos simular a aplicação de um reajuste em todos os preços, mas sem modificar a informação original.

var produtos = [ { nome : "Smartphone 5' Android", preco : 1200 }, { nome : "Notebook 4GB Windows 10", preco : 2100 }, { nome : "SmartTV 50' LED", preco : 8700 } ]; var produtosComReajuste = produtos.map(function(item){ return { nome : item.nome, preco : item.preco * 1.15 } }); produtosComReajuste.forEach(function(item){ console.log(`${item.nome.padEnd(30)} - ${item.preco.toLocaleString("pt-BR", { style : "currency", currency : "BRL"})}`); });

O resultado neste caso é a impressão dos valores no console do browser, como mostra a Figura 3.

Figura 3. Valores impressos no console
Execute o código

Exemplo 4

Neste quarto exemplo veremos como usar o recurso de arrow functions, do ECMAScript 6, para definir a função de callback com uma sintaxe mais simples:

var quadrados = [25, 16, 9, 4, 1]; var raizes = quadrados.map(numero => Math.sqrt(numero)); document.write(raizes);

O resultado aqui é: 5,4,3,2,1

Execute o código

Exemplo 5

Este exemplo usa novamente uma arrow function como função de callback, mas dessa vez ela recebe também o índice do item:

var copas = [1958, 1962, 1970, 1994, 2002]; var titulos = copas.map((ano,indice) => `${indice + 1} : ${ano}`); document.write(titulos.join("<br>"));

O resultado agora é a impressão do número do título (índice + 1, pois o índice começa em zero) e o ano em que o título foi obtido.

Execute o código

Map x Foreach

Os arrays em JavaScript possuem um outro método, chamado forEach, que às vezes confunde os desenvolvedores iniciantes quanto às diferenças entre ele e o map. Ambos percorrem o vetor original e para cada item podem executar um determinado procedimento, porém as semelhanças são apenas essas. O método forEach tem o objetivo apenas de iterar sobre um array, enquanto o map usa essa iteração como meio para chegar ao seu objetivo final, que é obter um novo array resultante do mapeamento do original.

Enquanto o map tem como retorno um novo array, o forEach não retorna nada. Ou seja, ele serve apenas para percorrer o vetor original e nos permite executar algum procedimento com cada item.

Então, quando usar cada um? Caso você queira obter um novo array cujos itens podem ser gerados a partir da aplicação dos itens originais em uma determinada função, então use o map. Se você precisa apenas percorrer um array e executar um determinado bloco de código para cada item, então use o forEach.

Map e a programação funcional

Desde seu lançamento, a linguagem JavaScript recebeu grandes atualizações e passou a contar com recursos muito desejados pelos programadores, alguns dos quais têm origem (ou principal uso) no paradigma funcional de programação. Exemplos disso foram a inclusão de métodos que promovem a imutabilidade e o uso de funções de alta ordem, dois conceitos fundamentais na programação funcional.

O map é um desses métodos: ele não altera o array original (imutabilidade) e recebe como parâmetro uma função (logo, ele é uma função de alta ordem).

Compatibilidade entre navegadores

O método map() é suportado por todos os browsers indicados na Tabela 1.

map() Chrome Firefox IE Edge Safari Opera
Sim Sim Sim Sim Sim Sim
Tabela 1. Browsers que suportam map()

Confira também

Artigos relacionados