JavaScript, Neo-Generation
Written 12/11/99
7. 連想配列
連想配列って何?という方は、 新JavaScript入門35 も併せてご覧ください。 以下の一部はそこと同じ記述です。
Dictionary オブジェクト JScript 2
連想配列は Dictionary オブジェクトという形で提供されます。
Dictionary オブジェクトは次のように生成します。
  var dic = new ActiveXObject("Scripting.Dictionary");
 
この Dictionary オブジェクトには、キーと項目の登録・削除、 キーがすでに存在しているか、キーと項目の配列を返す、 などの連想配列の基本的な機能が備わっています。
Add メソッド
キーと項目は Add メソッドを用いて登録します。
  var dic = new ActiveXObject("Scripting.Dictionary");
  dic.Add("さくら", "こんにゃく");
  dic.Add("知世", "ピーマン");
 
1度登録したキーは削除されない限り登録はできません。
  dic.Add("さくら", "こんにゃく");
  dic.Add("さくら", "ゆうれい");    //エラー
 
ここで気をつけなければいけないのは、 キーは数値と文字列両方を取れるということです。 すなわち、数値の1と文字列の"1"はキーとして別個に取れます。
  var dic = new ActiveXObject("Scripting.Dictionary");
  dic.Add(1, "aaa");
  dic.Add("1", "bbb");
  dic.Add(1.1, "ccc");              //これも別
 
実はオブジェクトさえもキーにできます。
  var ary = new Array();
  dic.Add(ary, "ddd");
 
項目のほうはもちろんなんでもOKです。
  dic.Add(1, 1.1);
  dic.Add(2, "モダン焼き");
  dic.Add(3, new Array(1, 2, 3));
 
Item プロパティ
登録したあと値を取り出すには Item プロパティを用います。
  var dic = new ActiveXObject("Scripting.Dictionary");
  dic.Add("さくら", "ほえ");
  alert(dic.Item("さくら"));
  dic.Add("知世", 1.38);
  alert(dic.Item("知世") + 1);       //1.38+1
  dic.Add("雪ちゃん", new Array(1, 3, 5));
  alert(dic.Item("雪ちゃん")[2]);    //配列の3番目の要素
 
Item プロパティは次のように登録にも使えます。 この場合は一度登録したあとでも登録しなおすことができます。
  var dic = new ActiveXObject("Scripting.Dictionary");
  dic.Item("さくら") = "ほえほえ";
  dic.Item("さくら") = "ほえほえハッピー";  //OK
  alert(dic.Item("さくら"));               //あとに登録したほうが有効
 
Item プロパティは省略できます。
  dic.Item("さくら") = "ほえほえ";
  dic("さくら") = "ほえほえ";
 
上の2つは同等です。
全てのキーについて処理する
全ての登録されたキーを取り出すには、Keys メソッドを用います。 ただし、このままでは使えず、まず VB の配列にして、 それを toArray メソッドで Array オブジェクトにします。
  objary = (new VBArray(objdic.Keys())).toArray();
 
こうしておいてから順に取り出します。
  dic = new ActiveXObject("Scripting.Dictionary");
  //名前と点数を登録する
  dic.Add("佐々木利佳", 348);
  dic.Add("李小狼", 374);
  dic.Add("木之本桜", 299);
  dic.Add("大道寺知世", 421);
  
  //全てのキーをArrayオブジェクトにする
  var a = (new VBArray(dic.Keys())).toArray();
  //点数の高い順にソートする
  //ソートできないバグはいつのまにか直ったようですね
  a.sort(new Function("a", "b", "return dic(b) - dic(a);"));
  for(var i = 0; i < a.length; i++)
      alert(a[i] + " : " + dic(a[i]));
 
その他の機能
上と逆に登録した値の配列を得るには次のように Items メソッドを使います。
  objarr = (new VBArray(objdic.Items())).toArray();
 
そのキーが登録済みかどうかは次のように調べます。
  objdic.Exists(key);
 
登録されていれば true、 そうでなければ false を返します。 キーとそれと対になる項目を削除するには Remove メソッドを使います。
  objdic.Remove(key);
 
キーと項目を全て削除するには RemoveAllメソッドを使います。
  objdic.RemoveAll();
 
キーを別のキーに置き換えるにはKeyプロパティを 用います。
  objdic.Key(key) = newkey;
 
項目数を得るにはCountプロパティを用います。
  objdic.Count;
 
空のオブジェクトを利用する
実際のところ、連想配列を使うときに Dictionary オブジェクトを使わなくても、 空のオブジェクトか Array オブジェクトを利用すればよいです。 IE なら次のようにします。
  var dic = new Object();
  dic["さくら"] = "こんにゃく";
  alert(dic["さくら"]);
 
ネスケの場合は、適当に空のユーザー定義オブジェクトを作ってください。

新JavaScript入門5JavaScriptサブルーチン集 も併せてご覧ください。

Back