Array.prototype.flat()

`flat()` 函數以遞迴方式將特定深度的子陣列重新串接成為一新的陣列

語法

`var newArray = arr.flat([depth]);`

參數

`depth` 選擇性

範例

展開巢狀陣列

```var arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]

var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]

var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]```

當遭遇空元素時

flat()函數會自動清除陣列中空的元素

```var arr4 = [1, 2, , 4, 5];
arr4.flat();
// [1, 2, 4, 5]
```

替代方案

`reduce` 與 `concat`

```var arr1 = [1, 2, [3, 4]];
arr1.flat();

//展開單層陣列
arr1.reduce((acc, val) => acc.concat(val), []);// [1, 2, 3, 4]
```
```//欲展開更深層的巢狀結構請使用reduce與concat的遞迴
function flattenDeep(arr1) {
return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
}
flattenDeep(arr1);// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
```
```//使用stack來實作非遞迴的展開
var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
function flatten(input) {
const stack = [...input];
const res = [];
while (stack.length) {
// pop value from stack
const next = stack.pop();
if (Array.isArray(next)) {
// push back array items, won't modify the original input
stack.push(...next);
} else {
res.push(next);
}
}
//reverse to restore input order
return res.reverse();
}
flatten(arr1);// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
```
``````// 递归版本的反嵌套
function flatten(array) {
var flattend = [];
(function flat(array) {
array.forEach(function(el) {
if (Array.isArray(el)) flat(el);
else flattend.push(el);
});
})(array);
return flattend;
}``````

規範

Specification Status Comment
`Array.prototype.flat` proposal Candidate (3)

瀏覽器相容性

Update compatibility data on GitHub
Desktop Mobile Server Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Chrome Full support 69 Edge Full support 79 Firefox Full support 62 IE No support No Opera Full support 56 Safari Full support 12 WebView Android Full support 69 Chrome Android Full support 69 Firefox Android Full support 62 Opera Android Full support 48 Safari iOS Full support 12 Samsung Internet Android Full support 10.0 nodejs Full support 11.0.0

Full support
Full support
No support
No support