Now lets up the game and introduce โflatMapโ. It combines the steps of first mapping over the array with map()
& then calling flat()
. Instead of calling 2 methods, just use flatMap()
๐
const foods = ['๐ซ', '๐ฆ'];
// โ map + flat
foods.map(food => [food, '๐']).flat();
// โ
flatMap
foods.flatMap(food => [food, '๐']);
// Result
// ['๐ซ', '๐', '๐ฆ', '๐']
flatMap()
works?Letโs go through step-by-step what flatMap()
is doing. I was a bit confused when I first learned this one. Cause I thought it flattens and then it does the mapping. But no ๐
. It first map()
and then it flat()
.
const names = ['jane', 'john'];
// Step 1: map
const nestedArray = names.map((name, index) => [name, index]);
// [ ['jane', 1], ['john', 2 ] ]
So now we have a nested array. And we can use flat()
to flatten the array.
const nestedArray = [
['jane', 1],
['john', 2]
];
nestedArray.flat();
// [ 'jane', 1, 'john', 2 ]
Of course, we can shorten this and just call flatMap()
. Letโs take a look ๐
const names = ['jane', 'john'];
const result = names.flatMap((name, index) => [name, index]);
// [ 'jane', 1, 'john', 2 ]
And Voila! We have the same result ๐
flatMap
only flattens 1-level deepWith flat()
, it accepts a parameter where you set the depth. What this means is you can specify how deep a nested array should be flattened.
const depth1 = [[1], [2]];
depth1.flat(); // same as depth.flat(1)
// [1, 2]
const depth2 = [[[1, 2]]];
depth2.flat(2);
// [1, 2]
Now for flatMap()
, you can only go 1-level deep.
const names = ['jane'];
names.flatMap((name, index) => [[name, index]]);
// [ ['jane', 1] ]
Letโs break this into 2 steps, so you can see whatโs going on.
const names = ['jane'];
// Step 1: created a 2-level deep array
const twoLevelDeep = names.map((name, index) => [[name, index]]);
// [ [ ['jane', 1] ] ]
// Step 2: flat using depth 1
twoLevelDeep.flat();
// [ ['jane', 1] ]
But if you do it separately, I can pass a depth
parameter and flatten it completely:
twoLevelDeep.flat(2);
// [ 'jane', 0, 'john', 1 ]
So, if you want it to flatten beyond depth of 1. Then it is better to NOT use flatMap()
and just call the methods separately ๐
flatMap
to filter itemOne really cool you can do with flatMap
is to remove an element. In this example, I want to remove all negative numbers.
const numbers = [1, 2, -3, -4, 5];
numbers.flatMap(number => {
return number < 0 ? [] : [number];
});
// [ 1, 2, 5]
Thatโs really cool! Itโs like acting like a filter
. But how is this actually working. The secret is the empty array. Letโs see what I mean.
const emptyNestedArray = [[], 1];
emptyNestedArray.flat();
// [ 1 ]
When you try to flatten an element thatโs an empty array, it simply removes that item. So we can use that knowledge to make flatMap
act kind of like filter
method. Neat right! ๐
Originally published at https://www.samanthaming.com
#javascript #array #web-development