新JavaScript入門 35
連想配列

ここでは、Dictionaryオブジェクトの使い方を説明します。 Dictionaryオブジェクトは、Perlなどでいういわゆる連想配列と同じ機能を提供します。 連想配列は、要するに配列の添え字に整数だけでなく文字列も使えるようにしたもの と思ってください。
Dictionary オブジェクトの使い方
例えば、ある学年の200人のテストの点数の一覧表があったとします。
      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);
keyvalue の関連付けが行われるわけです。
キーから値を取り出すには次のようにします。
    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のバグ?

その他の機能
上と逆に登録した値の配列を得るには次のようにItems メソッドを使います。
    objarr = (new VBArray(objdic.Items())).toArray();
キーとそれと対になる項目を削除するにはRemoveメソッドを 使います。
    objdic.Remove(key);
キーと項目を全て削除するにはRemoveAllメソッドを 使います。
    objdic.RemoveAll();
キーを別のキーに置き換えるにはKeyプロパティを 用います。
    objdic.Key(key) = newkey;
項目数を得るにはCountプロパティを用います。
    objdic.Count;

first, back, next, exit
Written 8/27/98