忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

JavaScript jQueryでの each を使った場合の再考

今回は、今更ながら 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 の処理で indexelement を記述せずに以下の様にしても、同様な処理が行えます。
以下の例では 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ファイルの動的に変更する方法











PR

コメント

コメントを書く