Array.prototype.flatMap()

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.{{EmbedInteractiveExample("pages/js/array-flatmap.html")}}

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 de profundidade 1.

Exemplos

map e flatMap

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.

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.

//=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

Alternativa

reduce e concat

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]
//=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

Especificações

Specification Status Comment
Array.prototype.flatMap proposal Rascunho

Compatibilidade de browser

BCD tables only load in the browser

Veja também