JavaScript | forEachを実務レベルでどう使うか

JavaScript JavaScript
スポンサーリンク

ここからは「forEachを実務レベルでどう使うか」を、初心者でも理解できるようにやさしく解説していきます。
テーマはこの2つです👇

1️⃣ オブジェクト配列の処理(よくあるデータ操作)
2️⃣ 非同期処理と forEach の相性(初心者がよくハマるポイント)


① オブジェクト配列の処理

よくあるシーン

「ユーザー情報」や「商品リスト」など、1人分・1個分をオブジェクトで表した配列を処理したいときに forEach は大活躍します。

例:ユーザーのリストを順に表示する

let users = [
  { name: 'Taro', age: 20 },
  { name: 'Hanako', age: 25 },
  { name: 'Ken', age: 30 }
];

users.forEach(function(user){
  console.log(user.name + ' さんは ' + user.age + ' 歳です。');
});
JavaScript

🧾 出力結果

Taro さんは 20 歳です。
Hanako さんは 25 歳です。
Ken さんは 30 歳です。

👉 各 user には { name: 'Taro', age: 20 } のようなオブジェクトが順に入ります。
user.nameuser.age で中身を取り出せます。


例:条件に応じて処理を分ける

users.forEach(function(user){
  if (user.age >= 25) {
    console.log(user.name + ' さんは大人クラスです。');
  } else {
    console.log(user.name + ' さんは若者クラスです。');
  }
});
JavaScript

💬 出力:

Taro さんは若者クラスです。
Hanako さんは大人クラスです。
Ken さんは大人クラスです。

例:合計年齢を出す(計算処理)

let totalAge = 0;
users.forEach(user => {
  totalAge += user.age;
});
console.log('合計年齢:', totalAge);
JavaScript

🧮 出力:

合計年齢: 75

例:HTMLリストに出力(Webでよく使う)

<ul id="userList"></ul>

<script>
let users = [
  { name: 'Taro', age: 20 },
  { name: 'Hanako', age: 25 },
  { name: 'Ken', age: 30 }
];

let ul = document.getElementById('userList');

users.forEach(function(user){
  let li = document.createElement('li');
  li.textContent = `${user.name}${user.age}歳)`;
  ul.appendChild(li);
});
</script>
JavaScript

👀 ページにこんなリストが表示されます:

Taro(20歳)
Hanako(25歳)
Ken(30歳)

ポイント

  • forEach は「何かを1つずつ画面に出す」「データを集計する」など“副作用”のある処理に向いています。
  • 「新しい配列を作りたい」場合は map() がより適しています。

② 非同期処理と forEach の相性

ここが 初心者が最もつまずくポイント です!

よくある勘違い

forEach の中で async / await を使うと
「順番に待ってくれる」と思いがちですが…実は違います!


例:非同期処理を「待ってくれない」ケース

let ids = [1, 2, 3];

ids.forEach(async (id) => {
  const res = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);
  const data = await res.json();
  console.log('データ取得:', data.title);
});

console.log('← ここが先に実行される');
JavaScript

🧾 結果:

← ここが先に実行される
データ取得: xxx
データ取得: yyy
データ取得: zzz

💡 理由:
forEach は「中の処理が終わるのを待たずに」次の要素へ進む。
つまり 非同期関数をうまく順番に処理できない のです。


✅ 正しい書き方(順番に非同期処理したい場合)

方法①:for…of を使う

let ids = [1, 2, 3];

async function fetchSequential() {
  for (const id of ids) {
    const res = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);
    const data = await res.json();
    console.log('取得:', data.title);
  }
  console.log('すべて完了');
}

fetchSequential();
JavaScript

⏱️ この書き方なら、1→2→3の順で確実に処理されます。


方法②:Promise.all() で一気に並列処理

「全部同時にリクエストして、終わるのを待つ」パターン。

let ids = [1, 2, 3];

async function fetchParallel() {
  const promises = ids.map(id =>
    fetch(`https://jsonplaceholder.typicode.com/posts/${id}`).then(res => res.json())
  );

  const results = await Promise.all(promises);
  results.forEach(post => console.log('取得:', post.title));
}

fetchParallel();
JavaScript

📈 これなら全部同時に動くので速いです。
ただしサーバー負荷が高くなるので、数が多い場合は注意。


まとめ(非同期で覚えるポイント)

やりたいことおすすめ方法備考
1つずつ順に実行したいfor...of + await一番安全で直感的
並列に実行したいPromise.all() + map同時処理で高速
forEach で async/await 使いたい❌ NG待ってくれない・バグの元

③ 実践練習問題

問題1:

以下の配列の人のうち、年齢が25歳以上の人の名前だけを console.log で出力せよ。

let people = [
  {name: 'Taro', age: 20},
  {name: 'Hanako', age: 25},
  {name: 'Ken', age: 30}
];
JavaScript

問題2:

次のURLの配列から、順番にAPIを呼び出して結果を出力せよ。
(ヒント:for...ofawait を使う)

let urls = [
  'https://jsonplaceholder.typicode.com/posts/1',
  'https://jsonplaceholder.typicode.com/posts/2',
  'https://jsonplaceholder.typicode.com/posts/3'
];
JavaScript

解答例

問題1

people.forEach(person => {
  if (person.age >= 25) {
    console.log(person.name);
  }
});
JavaScript

🟩 結果:

Hanako
Ken

問題2

async function loadData() {
  for (const url of urls) {
    const res = await fetch(url);
    const data = await res.json();
    console.log(data.title);
  }
}

loadData();
JavaScript

⏱️ 1→2→3 の順にタイトルが出力されます。


まとめ(実務で役立つ使い分け)

処理内容おすすめ
画面にリストを出す・合計を出す✅ forEach
新しい配列を作る✅ map
条件を満たす要素を探す✅ find / some
非同期処理(await 使う)✅ for…of
空の要素をスキップしたい✅ forEach(自動でスキップ)

タイトルとURLをコピーしました