【まっぷかんすう】

map関数 とは?

最終更新:
💡 一つずつ変身させて、新しい配列へ

要素を関数で変換し、その結果を集める操作。JavaScriptのArray.map()は、配列の各要素の変換結果から新しい配列を作ります。

📌 このページのポイント
一つずつ変換して、新しい配列へ元の配列変換新しい配列1n → n × 222n → n × 243n → n × 26[1, 2, 3].map(n => n * 2)新しい配列でも、中身まで自動複製はしない
JavaScriptのArray.map()で数値を2倍にする例。渡す関数が元データを書き換える場合、その変更は起こります。
ひよこ ひよこ
どう使うの?
ペンギン先生 ペンギン先生
JavaScriptなら、[1, 2, 3].map(n => n * 2)で[2, 4, 6]を作れるよ。nには各要素が順番に入り、関数が返した値が新しい配列の要素になるんだ。商品データから名前の一覧を作るような変換にも使えるよ。
ひよこ ひよこ
元の配列は絶対に変わらない?
ペンギン先生 ペンギン先生
map自体は元の配列を書き換える操作ではないよ。でも渡す関数の中で元データを書き換えれば、その変更は起こるんだ。特にオブジェクトは同じものを参照できるので、「新しい配列を作る=中身まで全部コピーする」ではないと覚えておこう。
ひよこ ひよこ
戻り値を書き忘れたら?
ペンギン先生 ペンギン先生
関数が何も返さないと、その位置の結果はundefinedになるよ。要素を取り除きたいならfilter、出力するだけならforEachやfor文など、目的に合う操作を選ぼう。空きスロットのある配列では、その空きに対してmapの関数は呼ばれないという点もあるよ。
ひよこ ひよこ
asyncの関数を渡したら、結果を待ってくれる?
ペンギン先生 ペンギン先生
mapは非同期処理の完了を待たず、Promiseの配列を返すよ。すべての成功結果をまとめて待つなら、async関数の中でawait Promise.all(配列.map(async関数))とする方法がある。どれかが失敗するとPromise.allは失敗するので、失敗の扱いや同時実行数も用途に合わせて考えよう。
ひよこ ひよこ
flatMapは何が違うの?
ペンギン先生 ペンギン先生
mapの変換結果を、さらに1段だけ平らにする操作だよ。たとえば[1, 2].flatMap(n => [n, n * 10])は[1, 10, 2, 20]になる。深い入れ子を全部平らにするわけではないんだ。なお、言語やライブラリによってmapの戻り値や仕組みは異なるから、使うものの仕様を確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「map関数」って出てきたら「要素を一つずつ変換して、その結果を集める操作」と思えばだいたいOK!
📖 おまけ:英語の意味
「map」 = 対応づける
💬 元の要素と変換後の値を対応づけるイメージだよ。ここではJavaScriptの配列のmapを中心に説明するね。

参考資料

← 用語集にもどる