flatMap() メソッドは、最初にマッピング関数を使用してそれぞれの要素をマップした後、結果を新しい配列内にフラット化します。これは、map() の後に深さ 1 の flat() を行うのと同じですが、これら 2 つのメソッドを別々にコールするよりもわずかに効率的です。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
構文
var new_array = arr.flatMap(function callback(currentValue[, index[, array]]) {
// return element for new_array
}[, thisArg])
パラメーター
currentValue- 配列で現在処理されている要素です。
indexOptional- 配列で現在処理されている要素のインデックスです。
arrayOptionalmapが呼び出された配列です。
callback- 新しい配列の要素を生成する関数。3 つの引数を受け取ります。
thisArgOptionalcallbackを実行するときにthisとして使用する値です。
戻り値
各要素がコールバック関数の結果であり、深さが 1 にフラット化された新しい配列です。
説明
コールバック関数の詳細な説明は Array.prototype.map() を参照してください。flatMap メソッドは、map の後に深さ 1 の flat を呼び出すのと同じです。
代替
reduce() と concat()
var arr = [1, 2, 3, 4]; arr.flatMap(x => [x, x * 2]); // is equivalent to arr.reduce((acc, x) => acc.concat([x, x * 2]), []); // [1, 2, 2, 4, 3, 6, 4, 8]
ただし、これは非効率的であり、大きな配列の場合は避けるべきであることに注意してください。処理ごとにガベージコレクションが必要な新しい一時配列を作成し、要素を単に追加するのではなく、現在のアキュムレータ配列から新しい配列に要素をコピーします。
Please do not add polyfills on this article. For reference, please check: https://discourse.mozilla.org/t/mdn-rfc-001-mdn-wiki-pages-shouldnt-be-a-distributor-of-polyfills/24500
例
map() と flatMap()
let arr1 = [1, 2, 3, 4]; arr1.map(x => [x * 2]); // [[2], [4], [6], [8]] arr1.flatMap(x => [x * 2]); // [2, 4, 6, 8] // only one level is flattened arr1.flatMap(x => [[x * 2]]); // [[2], [4], [6], [8]]
上記は map を使用することでも実現できますが、ここでは flatMap の使用方法をよりよく示す例を紹介します。
文章のリストから単語のリストを生成してみましょう。
let arr1 = ["it's Sunny in", "", "California"];
arr1.map(x => x.split(" "));
// [["it's","Sunny","in"],[""],["California"]]
arr1.flatMap(x => x.split(" "));
// ["it's","Sunny","in", "", "California"]
出力リストの長さは入力リストの長さとは異なる場合があることに注意してください。
map() のアイテムの追加と削除
flatMap は、map 中にアイテムの追加と削除(アイテムの数を変更)を行う方法として利用できます。つまり、常に一対一ではなく、多くのアイテムを多くのアイテムに(入力されたアイテムを個別に扱うことで)マップできるようになります。この意味では、filter の逆のような働きをします。単純に、アイテムを保持するには 1 要素の配列を返し、アイテムを追加するには複数要素の配列を返し、アイテムを削除するには 0 要素の配列を返します。
// 負の数をすべて取り除き、奇数を偶数と1に分割します。 let a = [5, 4, -3, 20, 17, -33, -4, 18] // |\ \ x | | \ x x | // [4,1, 4, 20, 16, 1, 18] a.flatMap( (n) => (n < 0) ? [] : (n % 2 == 0) ? [n] : [n-1, 1] ) // 期待される出力: [4, 1, 4, 20, 16, 1, 18]
仕様
| 仕様書 |
|---|
| ECMAScript (ECMA-262) Array.prototype.flatMap の定義 |
ブラウザー実装状況
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
flatMap | Chrome 完全対応 69 | Edge 完全対応 79 | Firefox 完全対応 62 | IE 未対応 なし | Opera 完全対応 56 | Safari 完全対応 12 | WebView Android 完全対応 69 | Chrome Android 完全対応 69 | Firefox Android 完全対応 62 | Opera Android 完全対応 48 | Safari iOS 完全対応 12 | Samsung Internet Android 完全対応 10.0 | nodejs 完全対応 11.0.0 |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応