JavaScriptのmap()とforEach()の違い:戻り値や使い分けを解説
はじめに
JavaScriptで配列をループ処理する方法として
map()
と forEach()
があります。
最初はこの2つの違いがよくわかりませんでした。
「どちらも繰り返し処理できるなら、同じではないのか」と思ったこともあります。
しかし、実際は 「目的」「戻り値」「使いどころ」 が違います。
本記事では
map()
と forEach()
の違いや使い分けについて解説します。
forEach()
とは
forEach()
は 「配列の要素を1つずつ処理する」 ためのメソッドです。
単に処理をするだけで、戻り値はありません(undefined
)。
例:
const fruits = ['apple', 'banana', 'orange'];
fruits.forEach((fruit, index) => {
console.log(index, fruit);
});
出力:
0 apple
1 banana
2 orange
✅ ポイント
- 配列を加工した新しい配列は返さない
- forEach() は「console.log()で表示する」や「データを保存する」など、「何かを表示・保存する処理」に使用する
map()
とは
map()
は 「配列の要素を1つずつ処理して、加工後の新しい配列を返す」 メソッドです。
例:
const fruits = ['apple', 'banana', 'orange'];
const upperFruits = fruits.map((fruit) => {
return fruit.toUpperCase(); // 大文字に変換
});
console.log(upperFruits);
出力:
["APPLE", "BANANA", "ORANGE"]
✅ ポイント
- 元の配列をもとに、新しい配列を作りたいときに使う
- 配列の中の値を、別の形に作りかえるときに使う
TypeScriptの場合
map()
や forEach()
は、TypeScriptでも基本的な動作はJavaScriptと同じです。
違いは、型情報があるかどうかです。
例
const fruits: string[] = ['apple', 'banana', 'orange'];
fruits.forEach((fruit: string, index: number) => {
console.log(index, fruit);
});
const upperFruits: string[] = fruits.map((fruit: string): string => {
return fruit.toUpperCase(); // 大文字に変換
});
-
forEach()
:戻り値はundefined
-
map()
:戻り値の型が自動でstring[]
になる
→ 「型の恩恵を受けられる」以外の違いはありません。
TypeScriptでも、「戻り値が必要ならmap()
、処理だけならforEach()
」という使い分けは
JavaScriptと同じ です。
forEach()
とmap()
の違い
比較ポイント | forEach() | map() |
---|---|---|
戻り値 | undefined | 新しい配列を返す |
主な用途 | 何かを表示・保存する処理 | 配列の変換・生成 |
✅ ポイント
- 新しい配列が欲しい →
map()
- 単純に処理をしたい →
forEach()
よく見かける誤解
「map()
で console.log だけしている」 処理を見かけることがあります。
戻り値を使わない場合は、forEach()
の方が自然です。
このような処理は、forEach()
で実装しましょう。
map()
は 「戻り値を使う前提の処理」 に使います。
おわりに
当初は「map()
で書いておけばいい」と考えていた時期もありましたが、
「戻り値を使うかどうか」という基準で選ぶようにすると、コードが読みやすくなりました。
「配列をどう扱いたいのか」を意識すると
自然に map()
と forEach()
の使い分けができるようになるはずです。
本記事が参考になれば幸いです。
Discussion