Amazon 数量限定タイムセール開催中

【ES6】JavaScript:forEach文とは?使い方や書き方を解説!

【ES6】JavaScript:forEach文とは?使い方や書き方を解説!

このページでは、JavaScriptでよく使われるループ処理の「forEach文」について解説しています。

「どんなときに使えるのか」「どうやって書けばいいのか」といった疑問に分かりやすく答えていますので参考にしてみてください。

ノーノちゃん

forEach文ってなんとなく聞いたことあるけど、どういうときに使うの?
forEach文は配列を処理したいときに使います。知っておくと便利なので覚えておくことをおすすめします。

ぶたさん

1. JavaScriptのforEach文とは?

JavaScriptのforEach文とは?

まずはじめにJavaScriptのforEach文について解説します。

基本情報

メソッド名 forEach文
登場時期 ES6(2015年)
使える対象 配列
使える制御構文 break:✕
continue:✕
return:◯
主な役割 配列の要素をひとつずつ順番に取り出して処理
基本文法 配列名.forEach(function(value, index, array)

配列を順番に処理するもの

配列を順番に処理

forEach文は、配列の要素をひとつずつ順番に処理するためのメソッドです。

具体的には下記のいずれかの要素を取り出すことができます。

各要素 意味
value 配列の中の値
index 配列の順番
(0から始まる)
array 配列全体
たとえば、次のように配列から「value(値)」のみを取り出すことができます。

ぶたさん

js
コピー 拡大
const bento = ["ごはん", "唐揚げ", "卵焼き"];

bento.forEach(function(sidedish) {
  console.log(sidedish);
});
コンソール(実行結果)
コピー 拡大
ごはん  
唐揚げ  
卵焼き

2. forEach文の書き方(基礎)

forEach文の書き方(基礎)

ここではforEach文の基本的な書き方をご紹介しています。

forEach 文の書き方はほとんど同じですので、一度覚えてしまえばさまざまな場面で使い回すことができます。

基本形

forEach文の基本
forEach文の基本形は、まず配列を作り、その下にforEach文のコードを書きます。
js
コピー 拡大
const 配列名 = ["値1", "値2", "値3", "値4"];

配列名.forEach(function(value, index, array) {
  // 処理内容
});
部分 種別 意味
const 変数宣言
キーワード
「変更できない変数(箱)を作る」という宣言
配列名 配列の名前 配列の名前
要素 配列の中身(文字列、数値など)
.forEach メソッド 配列を1つずつ取り出して順番に処理する
(function()) コールバック
関数
値を使って何をするかを書く関数
value 第1引数
(配列の中にある要素)
index 第2引数 順番
(配列の左から数えて何番目か)
array 第3引数 配列全体
(配列そのもの)
処理内容 配列から取り出したものをどう処理したいか書く場所
補足
引数(value, index, array)はあくまで名前ですので、自由に変えても問題ありません。

ただし、引数の順番(第1、第2、第3)は決まっていますので注意してください。

ノーノちゃん

引数は必ず3つ書かないといけないの?
value(値)のみ取り出したい場合はfunction(value)のように引数を1つ書くだけでOKです。

ぶたさん

valueを取得

forEach文でvalueを取得
forEach文を使って配列から「value(値)」を取り出す方法です。
js
コピー 拡大
const fruitsbasket = ["りんご", "バナナ", "オレンジ"];

fruitsbasket .forEach(function(fruits) {
  console.log(fruits);
});
コンソール(実行結果)
コピー 拡大
りんご
バナナ
オレンジ
  1. const fruitsbasket = ["りんご", "バナナ", "オレンジ"];
    「fruitsbasket」という名前の変数を作り、配列[]の中に「りんご」「バナナ」「オレンジ」という値を入れる。
  2. fruitsbasket.forEach(function(fruits)
    変数「fruitsbasket」の中から1つずつ値を取り出して、「fruits」という変数に入れる繰り返しを始める。
  3. console.log(fruits)
    変数「fruit」の中身をコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const fruitsbasket = ["りんご", "バナナ", "オレンジ"];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
fruitsbasket 配列名 各果物が入った箱の名前
= 代入演算子 右のものを左に入れる
[] 配列
リテラル
仕切り付きの箱
"りんご"
"バナナ"
"オレンジ"
要素 箱の中身
"" 囲い記号 囲まれたものを文字列として扱う
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【forEach文のコード】

js
コピー 拡大
fruitsbasket.forEach(function(fruits) {
  console.log(fruits);
});
コード 種別 意味
fruitsbasket 配列名 各果物が入っている箱
. ドット
演算子
「◯◯の中にある~」という意味の記号
forEach メソッド 配列の要素を1つずつ取り出して処理する命令
function() コールバック
関数
取り出した値を使って処理を行う関数
fruits 引数
(変数名)
forEachで取り出された各果物
{} ブロック
スコープ
{}内にくり返したい処理を書く
console.log() 出力命令 ()の中身をコンソールに表示

value / indexを取得

forEach文でvalueとindexを取得
forEach文を使って配列から「value/index(値/順番)」を取り出す方法です。
js
コピー 拡大
const fruitsbasket = ['りんご', 'バナナ', 'オレンジ'];

fruitsbasket.forEach(function(fruits, index) {
  console.log(`${index}番目のフルーツは${fruit}です`);
});
コンソール(実行結果)
コピー 拡大
0番目のフルーツはりんごです  
1番目のフルーツはバナナです  
2番目のフルーツはオレンジです
  1. const fruitsbasket = ['りんご', 'バナナ', 'オレンジ'];
    「fruitsbasket」という名前の変数を作り、配列[]の中に「りんご」「バナナ」「オレンジ」という値を入れる。
  2. fruitsbasket.forEach(function(fruits, index)
    「fruitsbasket」の中にあるフルーツの名前を1つずつ取り出して、取り出したフルーツを「fruits」、その順番(0番目、1番目)を「index」という変数に入れる繰り返し処理を始める。
  3. console.log(`${index}番目のフルーツは${fruits}です`);
    取り出したユーザー名「user」とユーザの年齢「age」を、文字と一緒にコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const fruitsbasket = ['りんご', 'バナナ', 'オレンジ'];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
fruitsbasket 配列名 各果物が入った箱の名前
= 代入演算子 右のものを左に入れる
[] 配列
リテラル
仕切り付きの箱
"りんご"
"バナナ"
"オレンジ"
要素 箱の中身
"" 囲い記号 囲まれたものを文字列として扱う
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【forEachf文のコード】

js
コピー 拡大
fruitsbasket.forEach(function(fruits, index) {
  console.log(`${index}番目のフルーツは${fruit}です`);
});
コード 種別 意味
fruitsbasket 配列名 各果物が入っている箱
. ドット
演算子
「◯◯の中にある~」という意味の記号
forEach メソッド 配列の要素を1つずつ取り出して処理する命令
function() コールバック
関数
取り出した値を使って処理を行う関数
fruits 引数
(変数名)
forEachで取り出された各果物
index 引数
(番号)
forEachで取り出された何番目の要素かを示す番号
console.log() 出力命令 ()の中身をコンソールに表示
${} プレース
ホルダ
{}内で指定した変数の中身を入れる

value / index / arrayを取得

forEach文でvalueとindexとarrayを取得
forEach文を使って配列から「value/index/array(値/順番/配列全体)」を取り出す方法です。
js
コピー 拡大
const fruitsbasket = ["りんご", "バナナ", "オレンジ"];

fruitsbasket.forEach(function(fruits, index, array) {
  console.log("-----------");
  console.log(`▶ 値(value): ${fruits}`);
  console.log(`▶ 順番(index): ${index}`);
  console.log(`▶ 配列全体(array): ${array}`);
});
コンソール(実行結果)
コピー 拡大
-----------
▶ 値(value): りんご
▶ 順番(index): 0
▶ 配列全体(array): りんご,バナナ,オレンジ
-----------
▶ 値(value): バナナ
▶ 順番(index): 1
▶ 配列全体(array): りんご,バナナ,オレンジ
-----------
▶ 値(value): オレンジ
▶ 順番(index): 2
▶ 配列全体(array): りんご,バナナ,オレンジ
  1. const fruitsbasket = ['りんご', 'バナナ', 'オレンジ'];
    「fruitsbasket」という名前の変数を作り、配列[]の中に「りんご」「バナナ」「オレンジ」という値を入れる。
  2. fruitsbasket.forEach(function(fruits, index, array)
    「fruitsbasket」の中にあるフルーツの名前を1つずつ取り出して、取り出したフルーツを「fruits」という変数に入れ、順番(0番目、1番目)を「index」という変数に入れる。そして「array」に配列全体を入れる繰り返し処理を始める。
  3. console.log();
    変数「fruits」「index」「array」を文字と一緒にコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const fruitsbasket = ['りんご', 'バナナ', 'オレンジ'];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
fruitsbasket 配列名 各果物が入った箱の名前
= 代入演算子 右のものを左に入れる
[] 配列
リテラル
仕切り付きの箱
"りんご"
"バナナ"
"オレンジ"
要素 箱の中身
"" 囲い記号 囲まれたものを文字列として扱う
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【forEachf文のコード】

js
コピー 拡大
fruitsbasket.forEach(function(fruits, index, array) {
  console.log("-----------");
  console.log(`▶ 値(value): ${fruits}`);
  console.log(`▶ 順番(index): ${index}`);
  console.log(`▶ 配列全体(array): ${array}`);
});
コード 種別 意味
fruitsbasket 配列名 各果物が入っている箱
. ドット
演算子
「◯◯の中にある~」という意味の記号
forEach メソッド 配列の要素を1つずつ取り出して処理する命令
function() コールバック
関数
取り出した値を使って処理を行う関数
fruits 引数
(変数名)
forEachで取り出された各果物
index 引数
(順番)
forEachで取り出された何番目の要素かを示す番号
array 引数
(配列全体)
forEachで取り出された配列全体
console.log() 出力命令 ()の中身をコンソールに表示
${} プレース
ホルダ
{}内で指定した変数の中身を入れる

3. forEach文の書き方(応用)

forEach文の書き方(応用)

ここではforEach文の応用的な書き方をご紹介しています。

オブジェクトの配列を処理したりする方法を載せていますので参考にしてみてください。

アロー関数で書く

forEach文をアロー関数で書く
従来の関数宣言「function()」を使わず「=>(アロー関数)」で書く方法です。

従来のfunction()で書いた場合

js
コピー 拡大
const fruitsbasket = ["りんご", "バナナ", "オレンジ"];

fruitsbasket .forEach(function(fruits) {
  console.log(fruits);
});

アロー関数で書いた場合

js
コピー 拡大
const fruitsbasket = ["りんご", "バナナ", "オレンジ"];

fruitsbasket.forEach(fruits => {
  console.log(fruits);
});

ノーノちゃん

何が変わってるの?
function(fruits)fruits =>に変わっています。

ぶたさん

ノーノちゃん

従来の関数宣言function()と比べて、関数を使っていることが分かりにくいね。
確かに慣れていないと分かりにくいかもしれませんが、よく使われるので覚えておきましょう。

ぶたさん

値の合計を計算

forEach文で値の合計を計算
forEach文を使って配列からvalue(値)を取り出し、合計を計算する方法です。
js
コピー 拡大
const scores = [80, 90, 75, 60];
let total = 0;

scores.forEach(function(score) {
  total += score;
});

console.log(`合計点は${total}点です`);
コンソール(実行結果)
コピー 拡大
合計点は305点です
  1. const scores = [80, 90, 75, 60];
    「scores(スコア)」という名前の変数を作り、配列[]の中に点数(80, 90, 75, 60)を入れる。
  2. let total = 0;
    「total(合計点)」という変数を作り、最初は「0」にしておく。
  3. scores.forEach(function(score) {total += score;});
    「scores」の中にある点数を1つずつ取り出して、「score」という変数に入れる繰り返しを始め、取り出した点数を「total」に足していく。
  4. console.log(`合計点は${total}点です`);
    変数「total」の中身をコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const scores = [80, 90, 75, 60];
let total = 0;
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
scores 配列名 点数が入った箱の名前
= 代入演算子 右のものを左に入れる
[] 配列
リテラル
仕切り付きの箱
80
90
75
60
要素 箱の中身
let 変数宣言
キーワード
変更できる変数(箱)を作る宣言
total 変数名 変更できない変数(箱)を作る宣言
0 変数値 箱(total)の中に入れるもの
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【forEachf文のコード】

js
コピー 拡大
scores.forEach(function(score) {
  total += score;
});

console.log(`合計点は${total}点です`);
コード 種別 意味
scores 配列名 点数が入った箱
. ドット
演算子
「◯◯の中にある~」という意味の記号
forEach メソッド 配列の要素を1つずつ取り出して処理する命令
function(score) コールバック
関数
取り出した値(score)を使って処理を行う関数
{} ブロック
スコープ
{}内にくり返したい処理を書く
total 変数名 合計点が入っている変数の名前
+= 加算代入
演算子
右の値を左に足して、その結果を左に入れる
score 引数
(変数名)
forEachで取り出された各点数
console.log() 出力命令 ()の中身をコンソールに表示

オブジェクトの配列を取得

オブジェクトの配列を取得
forEach文を使って、配列の中にあるオブジェクトの中身を取り出す方法です。
js
コピー 拡大
const users = [
  { name: "太郎", age: 25 },
  { name: "花子", age: 30 },
  { name: "次郎", age: 20 }
];

users.forEach(function(user) {
  console.log(`${user.name}さんは${user.age}歳です`);
});
コンソール(実行結果)
コピー 拡大
太郎さんは25歳です
花子さんは30歳です
次郎さんは20歳です
  1. const users = [];
    「users」という名前の変数を作り、その中に3人分の情報(名前と年齢)をオブジェクト形式で入れた配列を作る。
  2. users.forEach(function(user)
    「users」配列の中から1人ずつ取り出して、その情報を「user」という名前の変数に入れて、繰り返し処理を始める。
  3. console.log(`${user.name}さんは${user.age}歳です`);
    取り出した「user」オブジェクトの中の「name」と「age」の値をコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const users = [
  { name: "太郎", age: 25 },
  { name: "花子", age: 30 },
  { name: "次郎", age: 20 }
];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
= 代入演算子 右のものを左に入れる
[] 配列
リテラル
仕切り付きの箱
{} オブジェクト 引き出し付きの箱
(複数のデータを1つにまとめたもの)
name: "太郎"
name: "花子"
name: "次郎"
プロパティ 引き出しの名前(ラベル)
age: 25
age: 30
age: 20
プロパティ 引き出しの名前(ラベル)
name キー 引き出し
age キー 引き出し
太郎
花子
次郎
引き出しの中のデータ
25
30
20
引き出しの中のデータ
"" 囲い記号 囲まれたものを文字列として扱う
, カンマ演算子 左から順に実行して最後だけ使う
; 区切り記号 文末につける記号

 
【forEachf文のコード】

js
コピー 拡大
users.forEach(function(user) {
  console.log(`${user.name}さんは${user.age}歳です`);
});
コード 種別 意味
users 配列名 ユーザーの情報が入った配列
. ドット
演算子
「◯◯の中にある~」という意味の記号
forEach メソッド 配列の要素を1つずつ取り出して処理する命令
function() コールバック
関数
取り出した値を使って処理を行う関数
user 引数
(変数名)
forEachで取り出されたユーザーの情報
console.log() 出力命令 ()の中身をコンソールに表示
user.name プロパティ userの中のnameの値
user.age プロパティ userの中のageの値
`` テンプレート
リテラル記号
文字列の始まりと終わりを示す
${} プレース
ホルダ
{}内で指定した変数の中身を入れる

DOM操作する方法

forEach文でDOM操作する方法
ここではforEach文とDOM操作で、HTML内に果物の名前を追加する方法をご紹介しています。
DOM(Document Object Model) とは、HTMLを「ツリー構造」としてJavaScriptから扱えるようにしたものです。

DOM操作は、JavaScriptでツリーにアクセスし、HTMLの要素の追加・削除・書き換えなどを行うことです。

DOM操作前後

DOM操作前のプレビュー
コピー 拡大
果物リスト
DOM操作後のプレビュー
コピー 拡大
果物リスト

りんご
みかん
バナナ
このようにDOM操作をすると、JavaScriptからHTMLに文字を追加することができます。

ぶたさん

DOM操作するためのコード

HTML
コピー 拡大
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>【forEach】DOM操作で要素を追加</title>
</head>
<body>
  <h2>果物リスト</h2>

<!-- ここに果物の名前を入れたい -->
  <div id="list"></div>
  
  <script src="script.js"></script>
</body>
</html>
js
コピー 拡大
const fruits = ["りんご", "バナナ", "みかん"];
const list = document.getElementById("list");

fruits.forEach(function(fruit) {
  const p = document.createElement("p");
  p.textContent = fruit;
  list.appendChild(p);
});
  1. const fruits = ["りんご", "バナナ", "みかん"];
    「fruits」という名前の変数を作り、3つの果物の文字列を配列として入れる。
  2. const list = document.getElementById("list");
    HTMLの中にある、id="list" の要素を取得して、「list」という変数に入れる。
  3. fruits.forEach(function(fruit)
    「fruits」の中の要素を1つずつ取り出して、「fruit」という変数に入れて処理を繰り返す。
  4. const p = document.createElement("p");
    新しく段落「<p>」の要素を作る。
  5. p.textContent = fruit;
    段落の中のテキストに、取り出した果物の名前を入れる。
  6. list.appendChild(p);
    作った段落「<p>果物名</p>」を、HTMLのlist要素の中に追加する。

4. ループ処理を抜ける方法

forEach文でループ処理を抜ける方法

forEach文では、breakcontinueを使えないため、ループを途中で終了したりスキップしたりすることができません。

そのため、ループ処理を止めたい場合は他の方法を使う必要があります。

returnで処理をスキップ

forEach内でreturnを使い処理をスキップ
forEach内でreturnを使うとcontinueと同じように処理をスキップすることができます。
js
コピー 拡大
const numbers = [1, 2, 3, 4, 5];

numbers.forEach(function(number) {
  if (number === 3) {
    return; // numberが3のときだけ処理をスキップ
  }
  console.log(number);
});
コンソール(実行結果)
コピー 拡大
1
2
4
5
  1. const numbers = [1, 2, 3, 4, 5];
    「numbers」という名前の変数を作り、配列[]の中に数値(1, 2, 3, 4, 5)を入れる。
  2. numbers.forEach(function(number)
    「numbers」の中から1つずつ数字を取り出して「number」という変数に入れながら繰り返す。
  3. if (number === 3) {return; // numberが3のときだけ処理をスキップ}
    取り出した「number」が「3」のときは「return」でこの回の処理だけスキップして、次の数字へ進む。
  4. console.log(number);
    変数「number」の中身をコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const numbers = [1, 2, 3, 4, 5];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
numbers 配列名 番号が入った箱の名前
= 代入演算子 右のものを左に入れる
[] 配列
リテラル
仕切り付きの箱
1
2
3
4
5
要素 箱の中身
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【forEachf文のコード】

js
コピー 拡大
numbers.forEach(function(number) {
  if (number === 3) {
    return;
  }
  console.log(number);
});
コード 種別 意味
numbers 配列名 番号が入った箱の名前
. ドット
演算子
「◯◯の中にある~」という意味の記号
forEach メソッド 配列の要素を1つずつ取り出して処理する命令
function() コールバック
関数
取り出した値を使って処理を行う関数
number 引数
(変数名)
forEachで取り出された番号
{} ブロック
スコープ
{}内にくり返したい処理を書く
if 条件分岐 もし〇〇なら処理を分ける
number === 3 条件式 numberの中身が「3」と等しいかどうか
=== 厳密等価
演算子
左右の値が「型も値も同じ」かどうか比較
return 制御構文 関数内で処理した結果を結果を返す
console.log() 出力命令 ()の中身をコンソールに表示

someで代替して処理を中断

forEach文の代わりにsomeメソッドを使って処理を中断
forEach文の代わりにsomeメソッドを使って処理を中断する方法です。

someは「条件に合うものが一つでもあるか」を調べるためのメソッドです。

具体的には次のようなことを行います。

  • 配列の要素(値)を順番に1つずつチェック。
  • 条件を満たす要素(値)が1つでも見つかると、すぐに「true」を返して処理を醜虜する
  • もし条件を満たす要素が1つもなければ、最後まで処理して「false」を返す。

forEachで処理した場合(途中で止まらない)

js
コピー 拡大
const items = [1, 2, 3, 4, 5];

items.forEach(item => {
  console.log(item);
  if (item === 3) {
    // ここで処理を止めたくても止まらない
    return;
  }
});
コンソール(実行結果)
コピー 拡大
1
2
3
4
5
このようにforEach文はbreakが使えないため、処理を止めることができません。どうしても処理を止めたい場合は次のようにsomeで代替します。

ぶたさん

someで代替して処理を止める方法

js
コピー 拡大
const numbers = [1, 2, 3, 4, 5];

numbers.some(function(number) {
  console.log(number);
  if (number === 3) {
    return true;  // ここで処理を止めることができる
  }
  return false;
});
コンソール(実行結果)
コピー 拡大
1  
2  
3  
  1. const numbers = [1, 2, 3, 4, 5];
    「numbers」という名前の変数を作り、配列[]の中に数値(1, 2, 3, 4, 5)を入れる。
  2. numbers.some(function(number)
    配列「numbers」の中の数字を1つずつ取り出し、「number」という変数に入れて繰り返しを始める。
  3. console.log(number);
    変数「number」の中身をコンソール画面に表示する。
  4. if (number === 3) {}
    もし、取り出した「number」が「3」のときは「true(はい)」を返して処理を中断する。
  5. return false;
    もし、取り出した「number」が「3」以外のときは「false(いいえ)」を返して処理を続ける。

【配列のコード】

js
コピー 拡大
const numbers = [1, 2, 3, 4, 5];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
numbers 配列名 番号が入った箱の名前
= 代入演算子 右のものを左に入れる
[] 配列
リテラル
仕切り付きの箱
1
2
3
4
5
要素 リストの中身
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【some文のコード】

js
コピー 拡大
numbers.some(function(number) {
  console.log(number);
  if (number === 3) {
    return true;
  }
  return false;
});
コード 種別 意味
numbers 配列名 番号が入った箱
. ドット
演算子
「◯◯の中にある~」という意味の記号
some メソッド 条件に合う要素があればtrueを返し処理を終了
function() コールバック
関数
取り出した値を使って処理を行う関数
number 引数
(変数名)
取り出された番号
{} ブロック
スコープ
{}内にくり返したい処理を書く
console.log() 出力命令 ()の中身をコンソールに表示
if 条件分岐 もし〇〇なら処理を分ける
number === 3 条件式 numberの中身が「3」と等しいかどうか
=== 厳密等価
演算子
左右の値が「型も値も同じ」かどうか比較
return 制御構文 関数内で処理した結果を結果を返す
true 真偽値 「条件に合っているよ」というサイン
false 真偽値 「条件に合っていないよ」というサイン

everyで代替して処理を中断

forEach文の代わりにeveryメソッドを使って処理を中断
forEach文の代わりにeveryメソッドを使って処理を中断する方法です。
everyは「すべての条件が合うものがあるか?」を調べるためのメソッドです。

具体的には次のようなことを行います。

  • 配列の要素(値)を1つずつ順番にチェック。
  • すべての要素(値)が条件を満たしていれば「true」を返す。
  • 1つでも条件を満たさない要素(値)があれば、そこで処理をやめて「false」を返す。

forEachで処理した場合(途中で止まらない)

js
コピー 拡大
const items = [1, 2, 3, 4, 5];

items.forEach(item => {
  console.log(item);
  if (item === 3) {
    // ここで処理を止めたくても止まらない
    return;
  }
});
コンソール(実行結果)
コピー 拡大
1
2
3
4
5
このようにforEach文はbreakが使えないため、処理を止めることができません。どうしても処理を止めたい場合は次のようにeveryで代替します。

ぶたさん

everyで代替して処理を止める方法

js
コピー 拡大
const numbers = [1, 2, 3, 4, 5];

numbers.every(num => {
  console.log(num);
  return num !== 3;  // 3ならfalseを返して処理を止める
});
コンソール(実行結果)
コピー 拡大
1
2
3
  1. const numbers = [1, 2, 3, 4, 5];
    「numbers」という名前の変数を作り、配列[]の中に数値(1, 2, 3, 4, 5)を入れる。
  2. numbers.every(num =>
    配列「numbers」の中の数字を1つずつ取り出し、「num」という変数に入れて繰り返しを始めます。
  3. console.log(num);
    変数「num」の中身をコンソール画面に表示する。
  4. return num !== 3;
    数字が「3」でなければ「true」返し処理を続ける。数字が「3」なら「false」を返して繰り返し処理を止めます。

【配列のコード】

js
コピー 拡大
const numbers = [1, 2, 3, 4, 5];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
numbers 配列名 番号が入った箱の名前
= 代入演算子 右のものを左に入れる
[] 配列
リテラル
仕切り付きの箱
1
2
3
4
5
要素 リストの中身
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【every文のコード】

js
コピー 拡大
numbers.every(num => {
  console.log(num);
  return num !== 3;
});
コード 種別 意味
numbers 配列名 番号が入った配列
. ドット
演算子
「◯◯の中にある~」という意味の記号
every メソッド 条件を満たさない要素があればfalseを返し処理を終了
num 引数
(変数名)
forEachで取り出された番号
=> アロー関数 関数をかんたんに書くための記号
{} ブロック
スコープ
{}内にくり返したい処理を書く
console.log() 出力命令 ()の中身をコンソールに表示
return 制御構文 関数内で処理した結果を結果を返す
num !=== 3 条件式 numの中身が「3」と等しくなければtrue、等しければfalse
=== 厳密等価
演算子
左右の値が「型も値も同じ」かどうか比較
return 制御構文 関数内で処理した結果を結果を返す

5. よくある質問

forEach文やそれに関連するよくある質問

ここでは、forEach文やそれに関連するよくある質問をご紹介しています。

forEachでbreak使えない理由

forEach文は「配列をひとつずつ順番に処理していく」ことを前提に作られている特別なループです。

そのため「途中でやめる(break)」という考え方がそもそも組み込まれていません。

どうしても途中で処理を止めたい場合はsomeeveryのメソッドを利用しましょう。

forEachは配列以外に使えない?

forEach文は基本的に配列専用のメソッドなので、基本的には配列以外には使うことはできません。

ただし、NodeList,Set,Mapなど一部の配列のようなデータに対してはforEach文を使うことが可能です。

また、オブジェクトではそのままでは使えませんが、キーや値を取り出して配列に変換すれば、forEach文で処理することができます。

次のようにObject.keys()で、オブジェクトのキーだけを配列に取り出すとforEach文を使うことができます。

ぶたさん

js
コピー 拡大
const fruits = {
  リンゴ: 3,
  バナナ: 5,
  オレンジ: 2
};

Object.keys(fruits).forEach(fruit => {
  console.log(`${fruit}は${fruits[fruit]}個あります`);
});
コンソール(実行結果)
コピー 拡大
リンゴは3個あります
バナナは5個あります
オレンジは2個あります

for...of文との違い

forEach文とfor...of文との違いは以下のようになります。

forEach for...of
種類 メソッド ループ構文
対象 配列のみ 配列
文字列
Set
Map
使える制御構文 return break
continue
return
await ❌使えない ✅使える
index取得 ✅可能 ✅可能

 

for...of文についてはこちらで詳しく解説しています。
【ES6】JavaScript:for...of文とは?使えないときの対処法【ES6】JavaScript:for…of文とは?使えないときの対処法

awaitが使えない?

結論から言うと、forEach文の中ではawaitは使えません。

awaitは1つずつ順番を待ちながらゆっくりデータを処理しますが、forEach文は処理を待たずに進めるという特徴があります。

そのため、awaitの効果が無視されてしまいます。

6. まとめ

JavaScripのforEach文まとめ

forEach文は配列をひとつずつ順番に処理するためのメソッドです。

具体的には「value(値)」「index(順番)」「array(配列全体)」の3つの要素を処理することができます。

ただし、途中で処理を止めたり、値を集めて新しい配列を作ることは基本的にはできません。

配列の値の変換したいなどの場合は他のメソッドを使いましょう。

forEach文のまとめ
  • 配列をひとつずつ順番に処理するためのもの
  • 途中で止められない(breakやreturnは使えない)
  • 新しい配列は作れない(mapやfilterとは違う)
  • 元の配列を変更できない(ただし、内部で変更は可能)
  • 配列のすべての要素を使って何かしたいときに使う