Array.prototype.flatMap()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.

Experimental: Esta é uma tecnologia experimental (en-US)
Verifique a tabela de compatibilidade entre Navegadores cuidadosamente antes de usar essa funcionalidade em produção.

O método flatMap() primeiro mapeia cada elemento usando uma função de mapeamento e, em seguida, nivela o resultado em um novo array. É idêntico a um map seguido por um flat de profundidade 1, mas flatMap é bastante útil e mescla ambos em um método um pouco mais eficiente.

Experimente

Sintaxe

var new_array = arr.flatMap(function callback(currentValue[, index[, array]]) {
    // retorna o elemento para new_array
}[, thisArg])

Parâmetros

callback

Função que produz um elemento de uma nova Array, pegando três argumentos:

currentValue

O valor atual sendo processo na array.

indexOptional

O index do valor atual sendo processo na array.

arrayOptional

O map da array que foi chamado.

thisArgOptional

Valor para ser usado como this quando callback estiver sendo executado.

Valor de retorno

Uma nova array com cada elemento sendo o resultado da função callback e achatado ao valor de 1.

Descrição

Veja Array.prototype.map() para uma detalhada descrição da função callback. O método flatMap é idêntico ao map seguido por um chamado a flatten (en-US) de profundidade 1.

Exemplos

map e flatMap

js
var arr1 = [1, 2, 3, 4];

arr1.map((x) => [x * 2]);
// [[2], [4], [6], [8]]

arr1.flatMap((x) => [x * 2]);
// [2, 4, 6, 8]

//  Só o primeiro nível
arr1.flatMap((x) => [[x * 2]]);
// [[2], [4], [6], [8]]

Enquanto que acima poderíamos alcançar apenas com a utilização de map, já aqui temos um exemplo onde flatMap é mais apropriado.

Vamos gerar uma lista de palavras a partir de uma lista de sentenças.

js
let arr1 = ["it's Sunny in", "", "California"];

arr1.map((x) => x.split(" "));
// [["it's","Sunny","in"],[""],["California"]]

arr1.flatMap((x) => x.split(" "));
// ["it's","Sunny","in", "", "California"]

Perceba, o comprimento da lista de saída pode ser diferente do comprimento da lista de entrada.

Alternativa

reduce e concat

js
var arr1 = [1, 2, 3, 4];
arr1.flatMap((x) => [x * 2]);
// é equivalente a
arr1.reduce((acc, x) => acc.concat([x * 2]), []);
// [ 2, 4, 6, 8 ]

Especificações

Specification Status Comment
Array.prototype.flatMap proposal Rascunho

Compatibilidade com navegadores

BCD tables only load in the browser

Veja também