1 佐々木利佳 348
2 李小狼 374
……
100 木之本桜 299
……
200 大道寺知世 421
これを読みこんで、生徒の名前を入力したらその生徒の点数が出てくるような
プログラムを作るとします。普通の配列を使うとしたら次のようでしょうか。
var i, n, tmpname;
n = 200;
var name = new Array(n);
var score = new Array(n);
//ホントはファイルから読みこむんだろうけど
name[0] = "佐々木利佳"; score[0] = 348;
……
name[199] = "大道寺知世"; score[199] = 421;
while(true) {
tmpname = getname(); //名前を入力する
for(i = 0; i < n; i++)
if(name[i] == tmpname) { //一致したら
alert(score[i]); //点数を表示
break;
}
if(i == n) //一致する名前がなかったら終わり
break;
}
function getname() {
//省略
}
あらかじめ、名前でソートしてあればまだほかに方法があると思いますが、
普通は先頭から順に一致する名前を探すのでしょう。
この場合、平均100回名前が一致するかどうか調べなければなりません。Dictionaryオブジェクトを使うと次のようになります。
var tmpname;
var dic = new ActiveXObject("Scripting.Dictionary");
//Dictionaryオブジェクトに登録する
dic.Add("佐々木利佳", 348); //キーと値を登録する
……
dic.Add("大道寺知世", 421);
while(true) {
tmpname = getname();
if(!dic.Exists(tmpname)) //未登録ならば抜ける
break;
alert(dic.Item(tmpname)); //値を表示する
}
Dictionaryオブジェクトを使うと名前をキーにして直接点数にアクセスできます。
キーと値の登録は次のように行います。
objdic.Add(key, value);
key → value の関連付けが行われるわけです。
objdic.Item(key);
次のようにもできます。
objdic(key);
そのキーが登録済みかどうかは次のように調べます。
objdic.Exists(key);
登録されていればtrue、
そうでなければfalseを返します。
objarr = (new VBArray(objdic.Keys())).toArray();
このようにVBの配列を介してJScriptの配列を得ることができます。
//登録は省略
var a = (new VBArray(dic.Keys())).toArray();
for(var i = 0; i < a.length; i++)
alert(a[i] + ":" + dic(a[i]));
下のボタンを押すと登録された名前と点数が次々と表示されます。
こうして得られたArrayオブジェクトには sortメソッドを働かせることはできないようです。 JScript3.1のバグ?
objarr = (new VBArray(objdic.Items())).toArray();
キーとそれと対になる項目を削除するにはRemoveメソッドを
使います。
objdic.Remove(key);
キーと項目を全て削除するにはRemoveAllメソッドを
使います。
objdic.RemoveAll();
キーを別のキーに置き換えるにはKeyプロパティを
用います。
objdic.Key(key) = newkey;
項目数を得るにはCountプロパティを用います。
objdic.Count;