JavaScriptでeach(forEach)を使った配列・オブジェクトの繰り返し処理完全ガイド

JavaScriptのeachとは 2026

「配列の全要素に対して同じ処理をしたい」「オブジェクトのキーと値をすべて取り出して操作したい」——JavaScriptで繰り返し処理を書くとき、最もよく使われるメソッドのひとつがforEachです。

jQueryを使ったことがある方には「each」という名称の方が馴染み深いかもしれませんが、モダンなJavaScriptではforEachが標準的な繰り返し処理の手段として広く使われています。しかし「breakで途中で止められない」「非同期処理との組み合わせで想定外の動作をした」「mapとの違いが分からない」という疑問や失敗も多く聞かれます。

本記事では、forEachの基本構文から引数の意味、オブジェクトへの応用、制御の注意点、実践的なコード例まで体系的に解説します。

JavaScriptのeachとは

JavaScriptのeachとは

forEachメソッドの基本概念

JavaScriptのforEachメソッドは、配列の各要素に対して指定したコールバック関数を順番に実行する組み込みメソッドです。ES5(2009年)から標準仕様に含まれており、現在のモダンブラウザとNode.jsですべてサポートされています。

jQueryの$.each()はjQueryライブラリに依存しますが、Array.prototype.forEachはJavaScript標準機能のため、ライブラリなしで使用できます。

// jQueryのeach(ライブラリが必要) $.each(array, function(index, value) { });

// JavaScriptのforEach(標準機能) array.forEach(function(element, index, array) { });

配列とオブジェクトにおける繰り返し処理の違い

配列の順番通りに処理

配列に対してforEachを使うと、インデックス0から順番に各要素を処理します。要素の順序が保証されているため、順番通りの処理が必要な場面に適しています。

オブジェクトはキーと値で反復

JavaScriptのオブジェクトにはforEachが直接使えません。Object.keys()Object.values()Object.entries()などのメソッドでキーや値を配列に変換してからforEachを使います。

配列でのforEachの使い方

配列でのforEachの使い方

基本構文

配列.forEach(function(element, index, array) { … })

const fruits = ['りんご', 'バナナ', 'みかん'];

// 関数式での書き方 fruits.forEach(function(element, index, array) { console.log(index + ': ' + element); });

// アロー関数での書き方(モダンな記法) fruits.forEach((element, index) => { console.log(${index}: ${element}); });

出力結果:

0: りんご 1: バナナ 2: みかん

引数の意味

element:配列の要素

現在処理中の配列要素の値です。ループの各反復で、配列の先頭から順番に各要素の値が渡されます。変数名は任意で、itemvaluefruitなど内容を表す名前をつけると読みやすくなります。

index:要素のインデックス

現在処理中の要素のインデックス番号(0始まり)です。省略可能ですが、「何番目の要素か」を知りたい場合に使用します。

array:元の配列

forEachを呼び出した元の配列そのものへの参照です。ほとんどの場合省略されますが、コールバック関数内から元の配列にアクセスしたい場合に使います。

const numbers = [10, 20, 30];

numbers.forEach((element, index, array) => { console.log(要素: ${element}, インデックス: ${index}, 配列全体: ${array}); });

// 出力: // 要素: 10, インデックス: 0, 配列全体: 10,20,30 // 要素: 20, インデックス: 1, 配列全体: 10,20,30 // 要素: 30, インデックス: 2, 配列全体: 10,20,30

配列内の値を操作する例

コンソール出力

const scores = [85, 92, 78, 95, 88];

scores.forEach((score, index) => { const grade = score >= 90 ? '優' : score >= 80 ? '良' : '可'; console.log(受験者${index + 1}: ${score}点 → ${grade}); });

// 出力: // 受験者1: 85点 → 良 // 受験者2: 92点 → 優 // 受験者3: 78点 → 可 // 受験者4: 95点 → 優 // 受験者5: 88点 → 良

HTML要素への反映

const products = ['ノートPC', 'マウス', 'キーボード', 'モニター']; const listElement = document.getElementById('product-list');

products.forEach((product, index) => { const li = document.createElement('li'); li.textContent = ${index + 1}. ${product}; li.setAttribute('data-index', index); listElement.appendChild(li); });

forEachメソッドの仕様と使い方については、MDN Web Docs「Array.prototype.forEach()」も参照してください。

オブジェクトの反復処理

オブジェクトの反復処理

Object.keys() や Object.entries() を使ったループ

Object.keys(obj).forEach(key => …)

Object.keys()はオブジェクトのキーを配列として返します。forEachと組み合わせることで全キーを順番に処理できます。

const user = { name: '田中太郎', age: 30, email: '[email protected]' };

Object.keys(user).forEach(key => { console.log(${key}: ${user[key]}); });

// 出力: // name: 田中太郎 // age: 30 // email: [email protected]

Object.entries(obj).forEach(([key, value]) => …)

Object.entries()はキーと値のペアを[key, value]形式の配列として返します。分割代入と組み合わせることで、キーと値の両方を簡潔に扱えます。

const config = { theme: 'dark', language: 'ja', fontSize: 16, notifications: true };

Object.entries(config).forEach(([key, value]) => { console.log(設定項目「${key}」の値: ${value}); });

// 出力: // 設定項目「theme」の値: dark // 設定項目「language」の値: ja // 設定項目「fontSize」の値: 16 // 設定項目「notifications」の値: true

キー・値を取得して処理する方法

データの加工

const prices = { apple: 150, banana: 80, orange: 120, grape: 300 };

// 10%引きの価格を計算して表示 Object.entries(prices).forEach(([item, price]) => { const discounted = Math.floor(price * 0.9); console.log(${item}: ${price}円 → セール価格: ${discounted}円); });

// 出力: // apple: 150円 → セール価格: 135円 // banana: 80円 → セール価格: 72円 // orange: 120円 → セール価格: 108円 // grape: 300円 → セール価格: 270円

条件付き処理

const inventory = { ノートPC: 5, マウス: 0, キーボード: 12, モニター: 0, USBハブ: 3 };

Object.entries(inventory).forEach(([product, stock]) => { if (stock === 0) { console.log(【在庫切れ】${product}); } else if (stock <= 5) { console.log(【残りわずか】${product}: ${stock}個); } else { console.log(【在庫あり】${product}: ${stock}個); } });

// 出力: // 【残りわずか】ノートPC: 5個 // 【在庫切れ】マウス // 【在庫あり】キーボード: 12個 // 【在庫切れ】モニター // 【残りわずか】USBハブ: 3個

forEachでの制御

forEachでの制御

ループの途中で抜けられないことの注意点

forEachは途中でループを抜けることができません。break文を使おうとするとSyntaxErrorになり、returnを使ってもそのコールバック関数を抜けるだけで、ループ全体は続行されます。

const numbers = [1, 2, 3, 4, 5];

numbers.forEach(num => { if (num === 3) { return; // この反復をスキップするだけ、ループは続く } console.log(num); });

// 出力:1, 2, 4, 5(3はスキップされるが4と5は実行される)

// break は使えない(SyntaxError) // numbers.forEach(num => { // if (num === 3) break; // エラー // });

代替案:for…of / forループ / some / every

途中でループを停止したい場合は、以下の代替手段を使います。

手法 break可否 向いている場面
forEach × 全要素を必ず処理する場合
for…of 途中でbreakが必要な場合
for文 インデックス操作が必要な場合
some() trueを返すと停止 条件に合う要素が見つかったら停止
every() falseを返すと停止 すべての要素が条件を満たすか確認

const numbers = [1, 2, 3, 4, 5];

// for...ofでbreakを使う例 for (const num of numbers) { if (num === 3) break; // 3でループを停止 console.log(num); } // 出力:1, 2

// someを使って「途中で停止」を実現する例 numbers.some(num => { if (num === 3) return true; // trueを返すとループ停止 console.log(num); return false; }); // 出力:1, 2

実践例

配列の合計値を計算

const salesData = [150000, 230000, 180000, 320000, 210000]; let total = 0; let maxSale = 0; let maxIndex = 0;

salesData.forEach((sale, index) => { total += sale; if (sale > maxSale) { maxSale = sale; maxIndex = index + 1; // 1始まりの月番号に変換 } });

const average = Math.floor(total / salesData.length);

console.log(合計売上: ${total.toLocaleString()}円); console.log(平均売上: ${average.toLocaleString()}円); console.log(最高売上: ${maxIndex}月(${maxSale.toLocaleString()}円));

// 出力: // 合計売上: 1,090,000円 // 平均売上: 218,000円 // 最高売上: 4月(320,000円)

配列からHTMLリストを生成

const menuItems = [ { label: 'ホーム', url: '/', icon: '🏠' }, { label: 'ブログ', url: '/blog', icon: '📝' }, { label: 'ポートフォリオ', url: '/portfolio', icon: '💼' }, { label: 'お問い合わせ', url: '/contact', icon: '✉️' } ];

const nav = document.getElementById('navigation'); const ul = document.createElement('ul'); ul.className = 'nav-list';

menuItems.forEach((item) => { const li = document.createElement('li'); const a = document.createElement('a'); a.href = item.url; a.textContent = ${item.icon} ${item.label}; a.className = 'nav-link'; li.appendChild(a); ul.appendChild(li); });

nav.appendChild(ul);

オブジェクトのプロパティを加工して新しいオブジェクト作成

const students = { tanaka: { score: 85, attendance: 92 }, yamada: { score: 72, attendance: 88 }, suzuki: { score: 95, attendance: 100 }, sato: { score: 60, attendance: 75 } };

const results = {};

Object.entries(students).forEach(([name, data]) => { // 総合評価スコア(テスト70%+出席30%) const totalScore = Math.floor(data.score * 0.7 + data.attendance * 0.3); const grade = totalScore >= 90 ? 'A' : totalScore >= 80 ? 'B' : totalScore >= 70 ? 'C' : 'D';

results[name] = {
    ...data,
    totalScore,
    grade
};

});

console.log(results); // 出力: // { // tanaka: { score: 85, attendance: 92, totalScore: 87, grade: 'B' }, // yamada: { score: 72, attendance: 88, totalScore: 76, grade: 'C' }, // suzuki: { score: 95, attendance: 100, totalScore: 96, grade: 'A' }, // sato: { score: 60, attendance: 75, totalScore: 64, grade: 'D' } // }

よくある誤解と注意点

break / continue が使えない

forEachではbreak・continueは使えません。continueに相当する「この反復をスキップする」動作はreturnで代替できますが、break(ループの完全な停止)はfor…ofやsome/everyで対応します。

const items = ['a', 'b', 'c', 'd', 'e'];

// continueの代替(returnでスキップ) items.forEach(item => { if (item === 'c') return; // 'c'をスキップ console.log(item); }); // 出力:a, b, d, e

非同期処理内での挙動

Promiseやasync関数との組み合わせ

forEachはasync/awaitと組み合わせても、各非同期処理の完了を待ちません。非同期処理を含むループにforEachを使うと、処理が完了する前に次の反復が実行される「並列実行」になります。

const ids = [1, 2, 3];

// 誤った使い方(awaitが機能しない) ids.forEach(async (id) => { const data = await fetch(/api/users/${id}); console.log(await data.json()); }); // 全リクエストが同時に発生し、順序が保証されない

// 正しい使い方(for...ofを使う) async function processIds(ids) { for (const id of ids) { const data = await fetch(/api/users/${id}); console.log(await data.json()); } } // 1→2→3の順に順次処理される

// または並列実行が必要な場合はPromise.allを使う async function processIdsParallel(ids) { await Promise.all(ids.map(async (id) => { const data = await fetch(/api/users/${id}); console.log(await data.json()); })); }

forEach vs map の違い

メソッド 戻り値 主な用途
forEach undefined(戻り値なし) 副作用(DOM操作・集計・ログ出力)
map 新しい配列 各要素を変換した新しい配列を作る

const numbers = [1, 2, 3, 4, 5];

// forEachは戻り値がundefined const forEachResult = numbers.forEach(n => n * 2); console.log(forEachResult); // undefined

// mapは変換後の新しい配列を返す const mapResult = numbers.map(n => n * 2); console.log(mapResult); // [2, 4, 6, 8, 10]

JavaScriptのforEachの詳しい解説については、侍エンジニア「JavaScriptのforEachの使い方まとめ」JavaDrive「JavaScriptのforEachメソッドの使い方」TechMania「JavaScriptのforEach完全ガイド」も参考にしてください。

JavaScriptをはじめとするWeb開発の実践的な解説は、kakiro-web.comでも幅広く公開しています。

まとめ

forEachは配列・オブジェクトの反復処理に便利

JavaScriptのforEachメソッドは、配列の全要素に対してコールバック関数を順番に実行する標準機能です。DOM操作・集計処理・ログ出力など、各要素に対して副作用を伴う処理を行う場面に最適です。オブジェクトにはObject.entries()やObject.keys()と組み合わせて使用します。

引数の役割や制御方法を理解して効率的に使い分ける

forEachのコールバック関数はelement(要素)・index(インデックス)・array(元配列)の3引数を受け取ります。必要な引数だけを使うことでシンプルなコードが書けます。returnを使うことで現在の反復をスキップ(continueの代替)できますが、ループ全体の停止(break)はできない点が重要な制約です。

forEachの制約を理解し、必要に応じて他のループと使い分け

途中でループを停止したい場合はfor…ofまたはsome/every、新しい配列を生成したい場合はmap、非同期処理を順次実行したい場合はfor…ofのawaitを使うなど、目的に応じたループメソッドの使い分けがモダンJavaScript開発の基本です。

  • forEachは配列の全要素に対してコールバック関数を実行する標準メソッド
  • 引数はelement(要素)・index(インデックス)・array(元配列)の順で省略可能
  • オブジェクトはObject.keys()またはObject.entries()と組み合わせて使う
  • break・continueは使えない(returnでスキップ、breakはfor…ofを使う)
  • 戻り値はundefinedのため、変換後の配列が必要な場合はmapを使う
  • async/awaitとの組み合わせでは順次実行されない(for…ofを使う)
  • some()・every()でtrueまたはfalseを返すことで途中停止の代替が可能
See also  Linuxでファイル作成する方法|touchとviコマンドの使い方を解説
Copied title and URL