JavaScript Array.flatMap()

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
// ['๐Ÿซ', '๐Ÿ˜‹', '๐Ÿฆ', '๐Ÿ˜‹']

How 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 deep

With 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 item

One 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! ๐Ÿ‘

Resources

Originally published at https://www.samanthaming.com

#javascript #array #web-development

JavaScript Array.flatMap()
1 Likes40.25 GEEK