跳至主要内容

`Array.prototype.flat` 和 `Array.prototype.flatMap`

· 閱讀時間約 2 分鐘
Mathias Bynens ([@mathias](https://twitter.com/mathias))

Array.prototype.flat

此範例中的陣列是多層嵌套的:它包含一個陣列,而這個陣列又包含另一個陣列。

const array = [1, [2, [3]]];
// ^^^^^^^^^^^^^ 外層陣列
// ^^^^^^^^ 內層陣列
// ^^^ 最內層陣列

Array#flat 回傳一個展平後的陣列。

array.flat();
// → [1, 2, [3]]

// …等同於:
array.flat(1);
// → [1, 2, [3]]

預設的展平深度是 1,但您可以傳入任何數字值來遞迴展平到該深度。若要持續展平直到結果不再包含嵌套陣列,可以使用 Infinity

// 持續遞迴展平直到陣列不再包含嵌套陣列:
array.flat(Infinity);
// → [1, 2, 3]

這個方法為什麼叫做 Array.prototype.flat 而不是 Array.prototype.flatten 呢?閱讀我們的 #SmooshGate 撰寫內容來了解!

Array.prototype.flatMap

以下是另一個範例。我們有一個 duplicate 函數,它接受一個值並回傳一個包含該值兩次的陣列。如果我們將 duplicate 套用到陣列中的每個值,我們會得到一個嵌套陣列。

const duplicate = (x) => [x, x];

[2, 3, 4].map(duplicate);
// → [[2, 2], [3, 3], [4, 4]]

接著您可以對結果呼叫 flat 來展平陣列:

[2, 3, 4].map(duplicate).flat(); // 🐌
// → [2, 2, 3, 3, 4, 4]

由於此模式在函數式編程中相當常見,因此現在有一個專屬的 flatMap 方法。

[2, 3, 4].flatMap(duplicate); // 🚀
// → [2, 2, 3, 3, 4, 4]

flatMap 比起分別執行 mapflat 更加高效。

flatMap 的使用案例感興趣嗎?請查看 Axel Rauschmayer 的解釋

Array#{flat,flatMap} 支援