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)