flatMap or flatten

# Luan Nico (8 years ago)

I always surprise myself finding out there's no native way to flat an array. I know it's easy to implement, but to increase legibility I propose creating one of two options (either suffice, I believe):

  • flatMap : regular map, but flattens the array afterwards
  • flatten : just call on an array and get a new flattened array

Some examples usages of both:

With flatMap:

    const numbers = [12, 35];
    const divisors = numbers.flatMap(factors);

With flatten:

    const numbers = [12, 35];
    const divisors = numbers.map(factors).flatten();

Flattening an array is converting something like [1, [2, 3], 4] to [1, 2, 3, 4]. There is also need to choose whether it's deep or shallow.

I suggest adding a flatten shallow method, as that would be useful in all scenarios described.

Example implementation:

    Array.prototype.flatten = function () {
        return [].concat.apply([], this);
    };

What are your opinions about it?

# Frankie Bagnardi (8 years ago)

I often do the .reduce((xs, ys) => xs.concat(ys)) and I feel the need to

leave a comment explaining what it does.

+1 to this proposal.

# Jordan Harband (8 years ago)
# Darien Valentine (8 years ago)
# Igor Baklan (7 years ago)

+1

Good step toward (JS <= Scala ) unification. ( flatMap , flatten )

# Isiah Meadows (7 years ago)

Eh, not exactly. Scala uses a more general version that works with any monadic type (flatMap is technically a monadic bind, and flatten a monadic join), while this is roughly equivalent to [].concat(...array.map(func)) or _.flatten(_.map(array, func)).