ホーム >> 左脳ActionScript3 >> リファレンス(仮) >> >> データ型 >> コンポジット型 >> 配列 >> 連想記憶(ハッシュ)配列
連想記憶(ハッシュ)配列
連想記憶配列について。

単純には「インデックス(添え字、エレメント番号、とも言われる)に整数以外の値、文字列等を指定できる配列」の事。
C言語等の(古い?)言語では、配列の要素にアクセスするには必ず(正の)整数をインデックスとして指定し「何番目のデータなのか?」を明確にする必要があった。
Java Script や Action Script 等( EMCA Script という元となる規格があるようだ)は、配列の要素にアクセスに「インデックスが整数である」必要が無い。

以下のような表記をする。インデックスに文字列が使える。日本語も可能。

var o:Object    =   new Object();
o["通報"] =   110;
o["緊急"] =   119;
o["時報"] =   117;
o["天気"] =   177;    //  有料
trace(o);

これを実行すると、Arrayクラスのようなデータの一覧を期待するが、Objectクラスでは違う物が表示される。

[object Object]

これは「データ種別、データの型(クラス名)」を示している。

連想記憶配列の中身を列挙したい場合は、for ~ in を使う。

for(var key:String in o)
{
    trace(key + ":"+ o[key]);
}
for in」を使うと、Object が持つプロパティを列挙出来る。

通報:110
緊急:119
天気:177
時報:117

また、for each ~ in で、データの要素のみを列挙する事も可能。

for each(var value:int in o)
{
    trace("value:"+ value);
}
インデックスに関わらないデータ列挙に使用する。

value:110
value:119
value:177
value:117

for を使ったデータ列挙では、必ずしもデータを登録した順に列挙されるとは限らないので注意する事。登録順が必要な場合は、自力でその機能を実装する必要がある。

欲しいデータが明確な場合は以下のようなリテラルで問題ない。各要素を指定すると、データを読み出せる。

trace(o["通報"]);
trace(o.緊急);

[式] を使い、要素を指定するのは配列の一般的な表記だが、下の行の「.」を使った表記も可能。 文字インデックスで設定された要素は「プロパティとしてアクセス出来る」という仕様がある。インデックスに数値を使った場合には出来ない表記でもある。

110
119


Object の配列では、文字列しか使えない訳ではない。整数を使ったインデックス表記が可能だ。ただし、以下のような状況では問題が生じる。

var o:Object    =   new Object();
// 先に整数インデックス
o[10]   =   "Number";
o["10"] =   "String";
// 後に整数インデックス
o["2"]  =   "String";
o[2]    =   "Number";

for(var key:String in o)
{
    trace(key + " : "+ o[key]);
}
インデックスの指定が整数であっても、文字列に変換した再に同じデータになる場合は、 同じインデックスとして処理される。その結果、データを上書きしてしまう。

10 : String
2 : Number
Arrayクラスで上記と同様のコードを実行(コード中の Object を Array に変更しただけ。)しても、同じ結果になる。


実は、Object の連想記憶配列にも略記がある。

var o:Object    =   {   "通報":110    ,   "緊急":119    ,   "時報":117    };
o["天気"] =   177;    //  有料
for(var key:String in o)
{
    trace(key + ":"+ o[key]);
}
"{"、"}"を使い、「{ インデックス : データ , ~ }」と記述する。Object クラスの場合は new を使った表記では初期化代入は出来ないので注意。
ホーム >> 左脳ActionScript3 >> リファレンス(仮) >> >> データ型 >> コンポジット型 >> 配列 >> 連想記憶(ハッシュ)配列