In my previous post, I wrote about Celebrating JavaScript .flat() and how to flatten arrays, giving a lot of love to flat()
. I naturally wanted to follow it up with a post about flatMap()
and look at how it works and what it does.
flatMap()
The flatMap()
method is a super merger of flat()
and map()
.
Although based on the order of operations maybe it should be called mapFlat()
🤔.
flatMap()
goes through each element using a mapping function first before the returned result is flattened into a new array of depth one. It's just like using map()
followed by flat()
with a depth of 1, but is slightly more efficient (an excellent 2-for-1 method).
As flatMap()
only flattens 1 level, if you need to flatten beyond 1 level, you can separately call map()
then flat()
on your array.
Syntax
arr.flatMap(function callback(currentValue[, index[, array]]) {
// do work and return element for newArray
}
The callback function for flatMap()
takes three arguments:
- currentValue: the current element being processed
- index (optional): the index of the currentValue
- array (optional): the array
map()
was called upon
const arr = ['take me out', '', 'to the ball', 'game'];
arr.flatMap(a => a.split(' '));
// ["take", "me", "out", "", "to", "the", "ball", "game"]
Using flatMap()
is useful when you want to add and remove items during a map()
, as it can map many to many items by handling each input item separately, versus map()
itself that is always one-to-one. This means the resulting array can grow during the mapping, and it will be flattened afterward.
MDN web docs has a great example below that highlights how flatMap()
works to add and remove elements.
// Let's say we want to remove all the negative numbers and
// split the odd numbers into an even number and a 1
let a = [5, 4, -3, 20, 17, -33, -4, 18]
// |\ \ x | | \ x x |
// *[4,1, 4, [], 20, 16, 1, [], [], 18]
// *this line helps to visualize what the array will look
// like during mapping, with negative numbers represented as empty []
a.flatMap( (n) =>
(n < 0) ? [] :
(n % 2 == 0) ? [n] :
[n-1, 1]
)
// [4, 1, 4, 20, 16, 1, 18]
flatMap()
is yet another useful addition to the JavaScript Array toolbox and I’ll be using this when I need to going forward. Happy coding!
Resources
Array.prototype.flatMap()
Top comments (0)