JavaScript便利自作関数|カンマ等で区切られたフィールドデータを扱う関数

勘違いしながらドはまりしながら作り上げていくジジイの『JavaScript奮闘記』です。3択クイズプログラムが出来上がったので次なるターゲットに向け自作関数を準備しています。

ポク太郎です。

どんな言語を使おうが、分かりやすいのは慣れ親しんだ自分の論理。以前、別言語UWSC用に作った自作関数JavaScriptでも使えるよう移植します。

この便利な自作関数とは、カンマ等で区切られたフィールドデータに対し何個のフィールドが含まれてるかを調べる、n番目のフィールドを調べる2つの関数です。

  • nthc(dt,”,”)…カンマで区切られた変数dtに何個のフィールドがあるかを返す関数。
  • nthf(dt,”,”,n)…カンマで区切られた変数dtn番目のデータを返す関数。


分かりにくいJavaScriptの.indexOf(,)関数

まず最初に分かりにくいJavaScript標準関数.indexOf(,)の挙動確認。

第2引数は何文字目以降を調べるかで指定する、
戻り値は第2引数が何であろうが先頭からの位置で返される。

それを確かめるサンプルを以下に。

var dt='OikawaNao,NagaseAi,HojoMaki,HiroseNaomi';
var spr=',';

document.getElementById('debug').innerHTML = '第2引数i 該当文字 dt.indexOf(spr,i)の戻り値<br />';
for(var i=0; i<40; i++) {
document.getElementById('debug').innerHTML += i.toString()+ ' ' + dt.substring(i,i+1)+ ' ' + dt.indexOf(spr,i)+'<br />';
}

上記はdt.indexOf(spr,i)の第2引数の仕様を確認するため、文字列変数dt内の該当文字とその戻り値を表示させたもの。

ここから表示領域~

ここまで表示領域。

引数のデータに含まれるフィールドの数を返す関数nthc()

自作関数nthc()の仕様
nthc(dt,spr)…フィールドの数を返す。
戻り値:整数型
引数dt フィールドを含む文字列。
引数spr フィールドを示すセパレータ。例ではカンマ‘,’
使用例:…変数a4が代入される。

var a=nthc('OikawaNao,NagaseAi,HojoMaki,HiroseNaomi',',');

誤使用のパターンと対処:もし引数dt内に変数sprが存在しない場合は0を返す。

.split()なる便利な機能を見つけたのでそちらで作り変えました。その方が圧倒的に速いので。

function nthc(dt,spr) {
		var tmp;
		var r=0;
	if (dt.indexOf(spr) == -1){
				r=0;
	} else {
				tmp=dt.split(spr);
				r=tmp.length;
	}
				return r;
}

引数のデータのn番目のフィールドを返す関数nthf()

自作関数nthf()の仕様
nthf(dt,spr,n)n番目のフィールド内容を返す。
戻り値:文字列型
引数dt フィールドを含む文字列。
引数spr フィールドを示すセパレータ。例ではカンマ‘,’
引数n 返したいフィールドの番号。
使用例:…変数a‘NagaseAi’が代入される。

var a=nthf('OikawaNao,NagaseAi,HojoMaki,HiroseNaomi',',',2);

誤使用のパターンと対処:
もし引数dt内に変数sprが存在しない場合はdtをそのまま返す。
もし引数n1未満やフィールドの数を超える値が指定された場合は空文字列を返す。引数dt内に連続spr、行末にsprがある場合などは空文字列のデータがあるものとして空文字列を返す。

.split()なる便利な機能を見つけたのでそちらで作り変えました。その方が圧倒的に速いので。

function nthf(dt,spr,n) {
		var tmp;
		var rt='';
	if (dt.indexOf(spr) == -1){
				rt=dt;
	} else {
				tmp=dt.split(spr);
		if (n<1||n>tmp.length){
				rt='';
		} else {
				rt=tmp[n-1];
		}
	}
				return rt;
}

上記関数nthc()とnthf()でよく使うパターン

よく使用する場面は、フィールド内のデータをスキャンする場合。その際の構文は、

			var tmp;
for(var i=1; i<=nthc(dt,spr); i++) {
			tmp=nthf(dt,spr,i);
	//	変数tmpにはフィールドデータが順番に代入される
}

0番から始まる配列変数とは異なり、1から始まります。

配列変数をスキャンする場合は以下ですが。

			var tmp;
for(var i=0; i<=arry.length; i++) {
			tmp=arry[i];
	//	変数tmpには配列の内容が順番に代入される
}

つまり、変数iの開始値が異なります。

便利な関数ではありますが、ちょっと注意しないといけないのはそのスピード。全女優のフィールドを作って試したりしてないので。

フィールド数がおおよそ10個程度までのものを扱う場合を想定しています。

もっと速くて効率のいい方法あるよと言う方は教えて頂けるとありがたく存じます。

コメント

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