勘違いしながらドはまりしながら作り上げていくジジイの『JavaScript奮闘記』です。3択クイズプログラムが出来上がったので次なるターゲットに向け自作関数を準備しています。
ポク太郎です。
どんな言語を使おうが、分かりやすいのは慣れ親しんだ自分の論理。以前、別言語UWSC用に作った自作関数をJavaScriptでも使えるよう移植します。
この便利な自作関数とは、カンマ等で区切られたフィールドデータに対し何個のフィールドが含まれてるかを調べる、n番目のフィールドを調べる2つの関数です。
- nthc(dt,”,”)…カンマで区切られた変数dtに何個のフィールドがあるかを返す関数。
- nthf(dt,”,”,n)…カンマで区切られた変数dtのn番目のデータを返す関数。
分かりにくいJavaScriptの.indexOf(,)関数
まず最初に分かりにくいJavaScript標準関数.indexOf(,)の挙動確認。
それを確かめるサンプルを以下に。
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(dt,spr)…フィールドの数を返す。 戻り値:整数型 |
|
| 引数dt | フィールドを含む文字列。 |
| 引数spr | フィールドを示すセパレータ。例ではカンマ‘,’。 |
使用例:…変数aに4が代入される。
var a=nthc('OikawaNao,NagaseAi,HojoMaki,HiroseNaomi',',');
誤使用のパターンと対処:もし引数dt内に変数sprが存在しない場合は0を返す。 |
|
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(dt,spr,n)…n番目のフィールド内容を返す。 戻り値:文字列型 |
|
| 引数dt | フィールドを含む文字列。 |
| 引数spr | フィールドを示すセパレータ。例ではカンマ‘,’。 |
| 引数n | 返したいフィールドの番号。 |
使用例:…変数aに‘NagaseAi’が代入される。
var a=nthf('OikawaNao,NagaseAi,HojoMaki,HiroseNaomi',',',2);
誤使用のパターンと対処: |
|
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個程度までのものを扱う場合を想定しています。
もっと速くて効率のいい方法あるよと言う方は教えて頂けるとありがたく存じます。
コメント