今回は、今更ながら each の使い方を再考してみます。
each には2種類の使い方があります。 ひとつは jQuery の セレクタ に対してのものと、もう一つは配列やコレクションやオブジェクトに対するものです。
共にそれぞれが内部に持っているものに対して、順次処理を行うことでは似た感じです。
先ずは jQuery の セレクタ に対しての each の書き方ですが、以下の様になります。
$('セレクタ名').each(function([index[, element]]) {
// index : 各要素のインデックス番号(値は 0 から始まる)
// element : 繰り返し処理中の要素を参照
各要素に関する処理;
});
これを使った例として以下に HTML ファイル側のソースを示します。
■each を使った例
<html>
<head>
<meta charset="utf-8">
<title>test checkbox</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
//TEST関数
function testEach() {
$('li').each(function(index, element) {
console.log(index + ':' + $(element).text());
});
}
</script>
</head>
<body>
<h2>test each 1</h2>
<li>ラベル1</li>
<li>ラベル2</li>
<li>ラベル3</li>
<br />
<button onclick="javascript:testEach();">TEST</button>
</body>
</html>
9行目の .each(function(index, element) { ... }); で each 処理を行っています。
処理は要素の index と element で取得できるテキスト値をコンソールに出力しています。(以下の様になります。)
0: ラベル1 1: ラベル2 2: ラベル3
each の処理で index と element を記述せずに以下の様にしても、同様な処理が行えます。
以下の例では element の代わりに this を使っています。 特に index を使う必要が無ければ、いつもは this で記述することが多いです。
この this ですが、each の繰り返しの処理の中で、現在のセレクタ?(オブジェクト)を指し示す変数みたいなものと考えて良いと思います。
<html>
<head>
<meta charset="utf-8">
<title>test checkbox</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
//TEST関数
function testEach() {
$('li').each(function() { // index , elemnt を省略
console.log($(this).text());
});
}
</script>
</head>
<body>
<h2>test each 2</h2>
<li>ラベル1</li>
<li>ラベル2</li>
<li>ラベル3</li>
<br />
<button onclick="javascript:testEach();">TEST</button>
</body>
</html>
この例から少し発展させて <li> 要素がクリックされた時に、クリックされたラベル以外の文字列を表示する様に変更します。
<html>
<head>
<meta charset="utf-8">
<title>test checkbox</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
// 初期処理
$(function(){
// li 要素のクリック時の処理
$('li').on('click', function() {
// クリック時の[this]退避
var this_click = this;
// li 要素の全てを処理
$('li').each(function() {
if (this_click != this) {
// クリック以外のラベル
console.log($(this).text());
}
});
});
});
</script>
</head>
<body>
<h2>test each 2</h2>
<li>ラベル1</li>
<li>ラベル2</li>
<li>ラベル3</li>
</body>
</html>
それでは、配列やコレクションやオブジェクトに対する each について説明します。 構文的には以下の様になります。
$.each(collection, function(index, value) {
// collection : each処理の対象となる配列またはオブジェクト
// function : 各繰り返し処理で実行したい関数を指定
// index : 配列であればインデックス番号、オブジェクトであればkey
// value : 繰り返し処理中の値
各要素に関する処理;
});
$.each で宣言された関数の中で、引数である index, value を利用することが出来ます。
以下に、配列データとオブジェクトの中身を全てコンソールに出力する例を示します。
■配列やコレクションやオブジェクトに対する each 例
<html>
<head>
<meta charset="utf-8">
<title>test checkbox</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
//TEST関数
function testEach() {
// 配列
var arr = ['A001', 'B002', 'C003'];
$.each(arr, function(index, value) {
console.log('index(' + index + ') = ' + value);
});
// オブジェクト
var obj = {
'key1' : 'A001',
'key2' : 'B002',
'key3' : 'C003'
};
$.each(obj, function(index, value) {
console.log('index(' + index + ') = ' + value);
});
}
</script>
</head>
<body>
<h2>test each 5</h2>
<button onclick="javascript:testEach();">TEST</button>
</body>
</html>
コンソールの出力は以下の様になります。オブジェクトの場合 index にキーが渡されることがわかります。
index(0) = A001 index(1) = B002 index(2) = C003 index(key1) = A001 index(key2) = B002 index(key3) = C003
今回の例でも、 index, value を記述せずに this を使うことが出来ます。
■配列やコレクションやオブジェクトに対する each 例
<html>
<head>
<meta charset="utf-8">
<title>test checkbox</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
//TEST関数
function testEach() {
// 配列
var arr = ['A001', 'B002', 'C003'];
$.each(arr, function() {
console.log(this.valueOf()); // [PrimitiveValue]の値
//console.log(this + ""); // この方法でもOK
});
// オブジェクト
var obj = {
'key1' : 'A001',
'key2' : 'B002',
'key3' : 'C003'
};
$.each(obj, function() {
console.log(this.valueOf()); // [PrimitiveValue]の値
//console.log(this + "");
});
}
</script>
</head>
<body>
<h2>test each 6</h2>
<button onclick="javascript:testEach();">TEST</button>
</body>
</html>
$.each の中の this にはオブジェクト型で渡されるため、その中の値を取得するには this.valueOf とします。
この方法は面倒なので、一つ前の index, value を用いる方法が良いと思います。
最後に、繰返し処理のなかで for 文の break, continue の様な処理に付いて説明します。
以下の例では、6件の配列データを宣言し、2番目までは処理を continue し、5番目以降で break する処理を行います。
■配列に対する each 処理での break, continue 例
<html>
<head>
<meta charset="utf-8">
<title>test checkbox</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
//TEST関数
function testEach() {
// 6件の配列
var arr = ['A001', 'B002', 'C003', 'D004', 'E005', 'F006'];
$.each(arr, function(index, value) { // indexは[0]から始まることに注意!!
if (index <= 1) {
// 2番目までは処理をcontinue
return true;
}
if (index >= 4) {
// 5番目以降でbreak
return false;
}
console.log('index(' + index + ') = ' + value);
});
}
</script>
</head>
<body>
<h2>test each 6</h2>
<button onclick="javascript:testEach();">TEST</button>
</body>
</html>
コンソールの出力は以下の様になります。
index(2) = C003 index(3) = D004
関連する記事
⇒JavaScript 何に使う⇒JavaScript jQueryの使い方(セレクタ)
⇒JavaScript jQueryの使い方(セレクタ)その2
⇒JavaScript 関数の宣言について(function)
⇒JavaScript jQueryでJavascriptファイルの動的に変更する方法
コメント