# Javascript – How to flatten nested array in javascript?

arraysjavascript

As we know, to flatten the array `[[0, 1], [2, 3], [4, 5]]` by using the method `reduce()`

``````var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
return a.concat(b);
});
``````

So how to flatten this array `[[, ], [, ], [, ]]` to `[0, 1, 2, 3, 4, 5]`?

Perfect use case for recursion, which could handle even deeper structure:

``````function flatten(ary) {
var ret = [];
for(var i = 0; i < ary.length; i++) {
if(Array.isArray(ary[i])) {
ret = ret.concat(flatten(ary[i]));
} else {
ret.push(ary[i]);
}
}
return ret;
}

flatten([[[[], ], [[, ]], [, ]]]) // [0, 1, 2, 3, 4, 5]
``````

Alternatively, as an Array method:

``````Array.prototype.flatten = function() {
var ret = [];
for(var i = 0; i < this.length; i++) {
if(Array.isArray(this[i])) {
ret = ret.concat(this[i].flatten());
} else {
ret.push(this[i]);
}
}
return ret;
};

[[[[], ], [[, ]], [, ]]].flatten() // [0, 1, 2, 3, 4, 5]
``````

EDIT #1: Well, think it a little bit functional way (except for the named recursion which should be using Y-combinator for pure functional :D).

``````function flatten(ary) {
return ary.reduce(function(a, b) {
if (Array.isArray(b)) {
return a.concat(flatten(b))
}
return a.concat(b)
}, [])
}
``````

Let's adopt some ES6 syntax which makes it even shorter, in one line.

``````const flatten = (ary) => ary.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), [])
``````

But remember, this one cannot be applied as an array method, because arrow functions don't have theirs own `this`.

EDIT #2: With the latest `Array.prototype.flat` proposal this is super easy. The array method accepts an optional parameter `depth`, which specifies how deep a nested array structure should be flattened (default to `1`).

``````[[[[], ], [[, ]], [, ]]].flat()  // [[[], ], [[, ]], [, ]]
[[[[], ], [[, ]], [, ]]].flat(2) // [[], , [, ], , ]
[[[[], ], [[, ]], [, ]]].flat(3) // [, 1, , , 4, 5]
[[[[], ], [[, ]], [, ]]].flat(4) // [0, 1, 2, 3, 4, 5]
``````

So to flatten an array of arbitrary depth, just call `flat` method with `Infinity`.

``````[[[[], ], [[, ]], [, ]]].flat(Infinity) // [0, 1, 2, 3, 4, 5]
``````