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 },
]
*/