こんにちは、かつコーチです。
「複数の要素に同じ処理をしたいけど、1つずつ書くのは面倒…」と感じたことはありませんか。
jQueryには、選択した要素をひとつずつ取り出して処理してくれるeach()というメソッドがあります。
この記事では、each()の基本的な書き方から、配列・オブジェクトへの使い方、for文との違いまで、初心者向けに分かりやすく解説します。
読み終わる頃には、リストや複数のボタンをまとめて処理するコードが書けるようになります。
each()の基本の書き方
基本構文
each()は、jQueryで選択した要素の集合に対して、1つずつ繰り返し処理を行うメソッドです。
メソッドとは、オブジェクトに対して呼び出せる処理のことです。
基本の書き方は以下の通りです。
$('セレクタ').each(function(index, element) {
// indexには0から始まる連番が入る
// elementにはDOM要素(生のHTML要素)が入る
});
具体的な例を見てみましょう。
以下のようなリストがあるとします。
<ul id="fruit-list">
<li>りんご</li>
<li>みかん</li>
<li>ぶどう</li>
</ul>
このリストの各項目に連番を追加してみます。
$('#fruit-list li').each(function(index, element) {
// $(element)でjQueryオブジェクトに変換してから操作する
$(element).text((index + 1) + '. ' + $(element).text());
});
実行すると、以下のように表示が変わります。
1. りんご
2. みかん
3. ぶどう
thisキーワードを使う書き方
each()の中では、thisを使ってその時点の要素を参照することもできます。
$('#fruit-list li').each(function(index) {
// thisは生のDOM要素を指す
$(this).css('color', 'green');
});
thisは関数の中で「今処理している要素」を指すキーワードです。
第2引数のelementを使うかthisを使うかは好みで選んで問題ありません。
私はthisのほうがコードが短くなるので、こちらをよく使います。
配列・オブジェクトへの適用
each()はDOM要素だけでなく、配列やオブジェクトのループ処理にも使えます。
// 配列の場合
const fruits = ['りんご', 'みかん', 'ぶどう'];
$.each(fruits, function(index, value) {
console.log(index + ': ' + value);
});
// 0: りんご
// 1: みかん
// 2: ぶどう
配列やオブジェクトを処理する場合は、$('セレクタ').each()ではなく$.each()という書き方になります。
似ているようで違うメソッドなので、混同しないよう注意してください。
オブジェクトの場合も同様です。
const profile = {
name: 'かつコーチ',
job: 'エンジニア',
hobby: '筋トレ'
};
$.each(profile, function(key, value) {
console.log(key + ': ' + value);
});
// name: かつコーチ
// job: エンジニア
// hobby: 筋トレ
よくあるつまずきポイント・エラー対処
thisをjQueryオブジェクトと勘違いする
each()の中のthisは、jQueryオブジェクトではなく生のDOM要素です。
このため、いきなりjQueryのメソッドを呼び出そうとするとエラーになります。
❌ Before(つまずいた書き方)
$('#fruit-list li').each(function() {
this.text('置き換え');
// TypeError: this.text is not a function
});
私も初めてeach()を使ったとき、このエラーで15分ほど詰まりました。
コンソールに表示されたUncaught TypeError: this.text is not a functionというメッセージを見て、「textメソッドがないなんておかしい」と混乱したのを覚えています。
原因は、thisが生のDOM要素であり、jQueryのメソッドを持っていないことでした。
✅ After(正しい書き方)
$('#fruit-list li').each(function() {
$(this).text('置き換え');
// $()で囲むことでjQueryオブジェクトに変換する
});
$(this)のように$()で囲むことで、jQueryオブジェクトに変換してからメソッドを呼び出せます。
falseを返してもループが止まらない
each()の途中でループを止めたい場合、breakのような書き方は使えません。
❌ Before(つまずいた書き方)
$('#fruit-list li').each(function(index) {
if (index === 1) {
break;
// SyntaxError: Illegal break statement
}
});
each()はコールバック関数(関数を引数として渡す仕組み)を使ったループなので、break文はそのままでは使えません。
✅ After(正しい書き方)
$('#fruit-list li').each(function(index) {
if (index === 1) {
return false;
// returnにfalseを渡すとループが止まる
}
console.log(index);
});
// 0のみ出力される
each()のループを途中で止めたいときは、コールバック関数の中でreturn falseを書きます。
returnだけ(値なし)の場合はその回だけスキップし、次のループに進む点も覚えておくと便利です。
応用・一歩先の使い方
each()はネスト(入れ子)にして使うこともできます。
たとえば、複数のリストがあり、それぞれの中の項目を処理したい場合です。
$('.category').each(function() {
const $category = $(this);
$category.find('li').each(function(index) {
$(this).attr('data-index', index);
});
});
外側のeach()で大きなグループを、内側のeach()でそのグループ内の要素を処理する構成です。
また、each()の戻り値はjQueryオブジェクト自身なので、メソッドチェーン(メソッドを.でつなげて続けて呼び出す書き方)の途中に組み込むこともできます。
$('#fruit-list li')
.each(function(index) {
$(this).attr('data-index', index);
})
.css('cursor', 'pointer');
for文とどちらを使うべきか迷う場合は、jQueryオブジェクトに対して処理をするならeach()、単純な数値のループやパフォーマンスを重視するならfor文、という使い分けが基本です。
each()は内部で関数呼び出しが発生する分、大量データのループではfor文よりやや遅くなる傾向があります。
数千件以上を繰り返し処理するような場面では、for文への置き換えも検討してみてください。
まとめ
この記事のポイント
- each()は選択した要素を1つずつ取り出して処理するメソッド
- DOM要素には
$('セレクタ').each()、配列・オブジェクトには$.each()を使う - コールバック関数内の
thisは生のDOM要素なので、$(this)で変換してから使う - ループを途中で止めるには
return falseを使う(breakは使えない)
次に読むべき記事
- メソッドチェーンの書き方と考え方
- セレクタの書き方:$()の基本とCSSセレクタとの違い
- 属性・データ属性の取得と操作(attr・data)
タグ: jQuery, 初心者向け, 基本文法