Javascript: Flat & Flatmap

Una delle novità di ES2019 è l’intruduzione (finalmente) di due nuovi metodi dell’oggetto Array: flat() e flatMap()

Array.prototype.flat()

Il metodo flat() può appiattire un array multidimensionale:

const myArray = [[1, 2], [3], [4, 5, 6]]
console.log(myArray.flat())

// => [1, 2, 3, 4, 5, 6];

`flat() può anche accettare un parametro opzionale, la profondità. Di default flat() scende solo al primo livello di profondità di un array:

const myArray = [
  [1, 2, [3, 4]],
  [5, 6],
]
console.log(myArray.flat())

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

Passando invece un valore di profondità maggiore, otteniamo questo:

const myArray = [
  [1, 2, [3, 4]],
  [5, 6],
]
console.log(myArray.flat(2))

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

In questo caso abbiamo scelto un valore di profondità di ricorsione di 2 poiché il sotto-array [3, 4] è ad un livello inferiore degli altri elementi di myArray.

Eventualmente possiamo anche usare Infinity per appiattire un array di profondità arbitraria:

const myArray = [1, [3, [4, [5, 6, [7]]]]]

console.log(myArray.flat())
// => [1, 3, Array(2)];

console.log(myArray.flat(Infinity))
// => [1, 2, 3, 4, 5, 6, 7];

Array.prototype.flatMap()

Il metodo flatMap è l’equivalente di eseguire map e successivamente flat(1) su un array:

const myArray = [1, 2, 3, 4]
console.log(myArray.flatMap(x => [x * 2]))

// => [2, 4, 6, 8]

L’alternativa, senza flatMap() sarebbe:

const myArray = [1, 2, 3, 4]

const result = myArray.map(x => [x * 2])
console.log(result)
// => [[2], [4], [6], [8]]

console.log(result.flat())
// => [2, 4, 6, 8]

flatMap() è, ad esempio, utile nel caso in cui abbiamo una array di stringhe da splittare in parole:

const myString = ['Hello darkness', 'my old friend']
console.log(myString.flatMap(x => x.split(' ')))

// => ["Hello", "darkness", "my", "old", "friend"]