連想配列(Hash)


DESC 任意の値( Val )を任意の文字列( Key )に動的に関連つけるデータ構造 添字演算子を使用すると オブジェクトは "連想配列" 扱いになる


Objectを連想配列として使う


JScript の Object 型は、動的にメンバの追加、削除ができる。 これを利用して連想配列を実装する。
var tbl = {}; // name プロパティに "test" tbl.name = "kato"; // age プロパティに 10 をセットする tbl.age = 10; // 上書きする tbl.age = 20; // プロパティの値に配列オブジェクト参照させる tbl.friend = [ "taro", "hanako", "goro" ]; // プロパティの値に別のオブジェクト参照させる tbl.family = { father : "taro", mother : "hanako" };
プロパティを参照するには for - in を利用する
for( key in tbl ){ WScript.Echo( key + " " + tbl[key]); }



プロパティに使える値


プロパティ名には数値を含む、任意の文字が使える。
tbl.test = "a"; tbl.0 = "1"; tbl.key0 = "b";
添字演算子 [] を使えば、任意の式の値をプロパティ名に使える。 プログラム内で動的に決まる値をキーの名前にするときに使うと便利。
tbl[ "test" ] = 10; tbl[ func() ] = 10; tbl[ 10 + 2 ] = 10; obj = {}; tbl[ obj ] = 10;
WARNING 添字演算子をつかった場合は、すべてのプロパティは文字列として変換される。 そのため Object をキーとして利用する場合は注意が必要。
objA = { age : 10 }; objB = { name : "b" }; tbl[ objA ] = 10; // ここで上書きされる( objA と objB は文字列表現が同じ ) tbl[ objB ] = 20;
文字列をキーとして利用するのが無難
tbl[ "objA" ] = 10; tbl[ "objB" ] = 20;
// この書き方は OK var a = new Array(); a[ "key" ] = "val"; var dic = new Object( { H:"Hokkaido", T:"Television", B:"Broadcasting" // WARNING 最後の[,] はコンパイルエラー } ); // WARNING // 数値に変換できる文字を KEY にすると、数値で参照できる a[ "0" ] = "val_0"; // val print( a["key"] ); tbl = { a:"foo", b:"goo" }; WScript.echo( tbl.a ); WScript.echo( tbl["a"] );



Object


// Key をかえす for ( i in aa ) print( i + aa[i] ); var o = new Object(); // Property の追加 ( 名前は任意 ) o.a = "val1"; o.b = "val2"; o.c = "val3"; // Array も Object 扱い // key == index // RET // 0 "a" // 1 "b" // 2 "c" a = ["a", "b", "c" ]; for ( attr in a ) print( attr + " " + a[attr] );
// // Object の Property を取得する // Property 名がわからないときにこれを使う for ( attr in o ) print( attr + o[attr] ); var fs = new ActiveXObject("Scripting.FileSystemObject"); var d = fs.GetFolder ( "c:/Documents and Settings/" ); print( d.Name ); // 組み込み Object はだめ for ( i in d ) print( i + d[i] );
if (1) { a = [ "obj_10", "obj_00", "obj_01" ]; var aSort = new Array; for( i=0; i<a.length; i++ ){ s = a[i]; var num = s.split("_")[1]; num = parseInt( num ); // obj{ 10, obj10 } var obj = new Object; obj.num = num; obj.name = s; // obj10 // 追加 aSort.push( obj ); } for( i=0; i<aSort.length; i++ ){ print( "before " + aSort[i].num + " " + aSort[i].name ); } /* a = [ { 10, obj10 }, { 1, obj001 }, { 2, obj2 }, ] */