
一応スクリプト講座なので、一応今回は多次元配列を少しだけ解説します。
MSDNの情報を読んでみましょう。今まで解説してきていないことも書かれていますので、わからない部分があると思いますが、我慢して読んでみてくださいね。
JScript のオブジェクトとは、プロパティとメソッドを集めたものです。メソッドとは、オブジェクトのメンバとなっている関数のことです。プロパティとは、値または一連の値 (配列やオブジェクト) がオブジェクトのメンバとなったものを指します。JScript では 4 種類のオブジェクトをサポートしています。組み込みオブジェクト、ユーザーが作成したオブジェクト、ホスト (Internet Explorer の window や document) によって提供されるホスト オブジェクト、および Active X オブジェクト (外部構成要素) です。オブジェクトと配列はほとんど同じように扱われます。どちらにも任意のプロパティを割り当てるすることができ、配列もある意味では特殊なオブジェクトとして扱われています。Arrays オブジェクトと Objects オブジェクトとの相違点は、配列には特殊な処理を行う length プロパティがあるのに対してオブジェクトにはないという点です。
JScript のすべてのオブジェクトは、拡張プロパティをサポートしています。拡張プロパティとは、実行時に直接、追加または削除できるプロパティです。これらのプロパティには、数値を含む任意の名前を指定できます。プロパティの名前が単純な識別子の場合は、オブジェクトの名前の後ろにピリオドを置いて記述します。
プロパティの名前が単純な識別子ではない場合や、スクリプトを書いた時点では決まっていない場合は、プロパティを角かっこで囲み、インデックスとして任意形式の式として記述することもできます。JScript のすべての拡張プロパティの名前は、オブジェクトに追加される前に文字列に変換されます。JScript では、直接的には多次元配列はサポートされていません。しかし、他の配列を含め、配列には要素として任意の種類のデータを保存できます。そのため、他の配列の要素内に配列を保存することで、多次元配列と同じ動作を実行できます。
上記赤い部分ですが、newキーワードで作成するオブジェクトには、Arrayオブジェクト(配列オブジェクト)のほかにも、DateオブジェクトやObjectオブジェクトがあります。
var myObj=new Object()
この場合は配列オブジェクトではないため、myObjにはlengthプロパティがないという意味です。
拡張プロパティですが、ユーザーが作成したオブジェクトにはプロパティを定義できるようになっています。メソッドも定義できますが、ここでは詳しく説明しません(というより僕も詳しくありません)。
多次元配列はサポートされていないが、それと同じような扱いをさせることはできるということですね。
多次元配列って?
次元はお分かりですよね。一次元(線)・二次元(平面)・三次元(空間)・・・の次元です。
今まで扱ってきた配列はhairetu[0]〜hairetu[n]のようにコレクション番号を示す部分がひとつだけでしたね。hairetu[0]="赤",hairetu[1]="青"・・・というように直線的に連なる配列でした。
二次元配列では(x,y)で表すような平面的な配列になります。例えてみれば将棋盤の目やオセロの目、縦横に並んだ表のような升目に配置される要素を配列にします。一般的なプログラミング言語では、hairetu(0,0)="黒",hairetu(0,1)="白",hairetu(0,2)="白",hairetu(1,0)="白",hairetu(1,1)="黒",hairetu(1,2)="白"・・・hairetu(m,n)="黒"のように升目に対し要素を入れることができるものです。

三次元配列ですと、ルーピックキューブのような立体的升目を並べた各立体升目に要素を入れる感じになります。hairetu(x,y,z)形式が一般的です。
JavaScript,JScriptでは配列の記述方法自体が他のプログラミング言語と違います。
例えばVisual Baisc(VBScriptも)では、変数名(m, n)のように記述しますが、JScriptではこのような書き方はありません。
またJScriptでは多次元配列はサポートされていない・・・つまりはhairetu(x, y)あるいはhairetu[x,y]のようには記述できません。しかしながら配列オブジェクトは配列オブジェクトを要素にすることができることから次のように書くことができます。
var hairetu=new Array()
これによりhairetuは配列オブジェクトになりますね。hairetu[0]=★とすれば一番目の要素に★を代入することになりますね。この★が配列オブジェクトであっても問題ないんです。つまりhairetu[0]=newe Array()とすればhairetu[0]自身が配列オブジェクトとなります。ということはhairetu[0]にも複数の要素をインデックス番号付きで代入することができることになります。
hairetu[0][0]="赤";hairetu[0][1]="青";hairetu[0][2]="黄色"のように代入することができますね。
また更にhairetu[1]=new Array()とすればhairetu[1]も配列オブジェクトになります。するとhairetu[1][0]="red";hairetu[1][1]="blue";hairetu[1][2]="yellow"の様に代入して利用できます。
これこそ二次元配列のように使用するということなのですね。hairetu[x][y]
var hairetu=new Array()
for(i=0;i<=m;i++){
hairetu[i]=new Array()
}
hairetu[0]〜hairetu[m]を配列オブジェクトにしています。
|
x・・・行、y・・・列 |
0 |
1 |
2 |
○ |
n |
|
0 |
hairetu[0][0] |
hairetu[0][1] |
hairetu[0][2] |
hairetu[0][○] |
hairetu[0][n] |
|
1 |
hairetu[1][0] |
hairetu[1][1] |
hairetu[1][2] |
hairetu[1][○] |
hairetu[1][n] |
|
2 |
hairetu[[2][0] |
hairetu[2][1] |
hairetu[2][2] |
hairetu[2][○] |
hairetu[2][n] |
|
● |
hairetu[●][0] |
hairetu[●][1] |
hairetu[●][2] |
hairetu[●][○] |
hairetu[●][n] |
|
m |
hairetu[m][0] |
hairetu[m][1] |
hairetu[m][2] |
hairetu[m][○] |
hairetu[m][n] |
さて、前回のMetaCreationsフィルタによるランダムトランジションスライドショーでは、0〜21までの整数からランダムに発生させた値を、koukaというフィルタタイプを示すポインタに代入し、その値によってfNameとsNameという二つの配列オブジェクトの要素からフィルタのタイプとそれに対応するCopyright文字列を選択してくるという使い方をしていました。この二つの配列オブジェクトは共にkoukaの値に対応されているわけですね。次の表を見てください。ちょっと時が小さくてすみません。
|
|
0 |
1 |
2 |
・・・ |
21 |
|
0 |
"ColorFade" |
"GlassBlock" |
"Liquid" |
・・・ |
"BurnFilm" |
|
1 |
"{2A54C908-07AA-11D2-8D6D-00C04F8EF8E0}" |
"{2A54C913-07AA-11D2-8D6D-00C04F8EF8E0}" |
"{AA0D4D0A-06A3-11D2-8F98-00C04FB92EB7}" |
・・・ |
"{107045D0-06E0-11D2-8D6D-00C04F8EF8E0}" |
このようにkoukaに対応して要素を選び出せばいいのです。これは二次元配列になっていますね。二次元配列では、最初の数字が行数で、2 番目の数が列数と覚えましょう。
var metafilter=new Array()
for(i=0;i<=1;i++){
metafilter[i]=new
Array()
}
あるいは単純に
var metafilter=new Array()
metafilter[0]=new Array()
metafilter[1]=new
Array()
これでmetafitlter[0]とmetafilter[1]という配列オブジェクトが作成されました。metafitlter[0][kouka]とmetafilter[1][kouka]の要素の中身でフィルタ種類とCopyrightがセットできることになりますね。
metafilter[0]=["ColorFade","GlassBlock","Liquid","Twister","CenterCurls","PageCurl","Water","LightWipe","RollDown","Wormhole","Lens","FadeWhite","Jaws","FlowMotion","Vacuum","Grid","Threshold","Ripple","Curls","PeelABCD","Curtains","BurnFilm"]//効果名用
metafilter[1]=["{2A54C908-07AA-11D2-8D6D-00C04F8EF8E0}","{2A54C913-07AA-11D2-8D6D-00C04F8EF8E0}","{AA0D4D0A-06A3-11D2-8F98-00C04FB92EB7}","{107045CF-06E0-11D2-8D6D-00C04F8EF8E0}","{AA0D4D0C-06A3-11D2-8F98-00C04FB92EB7}","{AA0D4D08-06A3-11D2-8F98-00C04FB92EB7}","{107045C5-06E0-11D2-8D6D-00C04F8EF8E0}","{107045C8-06E0-11D2-8D6D-00C04F8EF8E0}","{9C61F46E-0530-11D2-8F98-00C04FB92EB7}","{0E6AE022-0C83-11D2-8CD4-00104BC75D9A}","{107045CA-06E0-11D2-8D6D-00C04F8EF8E0}","{107045CC-06E0-11D2-8D6D-00C04F8EF8E0}","{2A54C904-07AA-11D2-8D6D-00C04F8EF8E0}","{2A54C90B-07AA-11D2-8D6D-00C04F8EF8E0}","{2A54C90D-07AA-11D2-8D6D-00C04F8EF8E0}","{2A54C911-07AA-11D2-8D6D-00C04F8EF8E0}","{2A54C915-07AA-11D2-8D6D-00C04F8EF8E0}","{AA0D4D03-06A3-11D2-8F98-00C04FB92EB7}","{AA0D4D0E-06A3-11D2-8F98-00C04FB92EB7}","{AA0D4D10-06A3-11D2-8F98-00C04FB92EB7}","{AA0D4D12-06A3-11D2-8F98-00C04FB92EB7}","{107045D0-06E0-11D2-8D6D-00C04F8EF8E0}"]//Copyright用
new Array()はなくても直接要素をセットできるので、まとめると次のようになります。
var metafilter=new Array()
metafilter[0]=["ColorFade","GlassBlock","Liquid","Twister","CenterCurls","PageCurl","Water","LightWipe","RollDown","Wormhole","Lens","FadeWhite","Jaws","FlowMotion","Vacuum","Grid","Threshold","Ripple","Curls","PeelABCD","Curtains","BurnFilm"]//効果名用
metafilter[1]=["{2A54C908-07AA-11D2-8D6D-00C04F8EF8E0}","{2A54C913-07AA-11D2-8D6D-00C04F8EF8E0}","{AA0D4D0A-06A3-11D2-8F98-00C04FB92EB7}","{107045CF-06E0-11D2-8D6D-00C04F8EF8E0}","{AA0D4D0C-06A3-11D2-8F98-00C04FB92EB7}","{AA0D4D08-06A3-11D2-8F98-00C04FB92EB7}","{107045C5-06E0-11D2-8D6D-00C04F8EF8E0}","{107045C8-06E0-11D2-8D6D-00C04F8EF8E0}","{9C61F46E-0530-11D2-8F98-00C04FB92EB7}","{0E6AE022-0C83-11D2-8CD4-00104BC75D9A}","{107045CA-06E0-11D2-8D6D-00C04F8EF8E0}","{107045CC-06E0-11D2-8D6D-00C04F8EF8E0}","{2A54C904-07AA-11D2-8D6D-00C04F8EF8E0}","{2A54C90B-07AA-11D2-8D6D-00C04F8EF8E0}","{2A54C90D-07AA-11D2-8D6D-00C04F8EF8E0}","{2A54C911-07AA-11D2-8D6D-00C04F8EF8E0}","{2A54C915-07AA-11D2-8D6D-00C04F8EF8E0}","{AA0D4D03-06A3-11D2-8F98-00C04FB92EB7}","{AA0D4D0E-06A3-11D2-8F98-00C04FB92EB7}","{AA0D4D10-06A3-11D2-8F98-00C04FB92EB7}","{AA0D4D12-06A3-11D2-8F98-00C04FB92EB7}","{107045D0-06E0-11D2-8D6D-00C04F8EF8E0}"]//Copyright用
ではこれで動作するか確認しておきましょう。
fName[kouka]のところはmetafilter[0][kouka]となり、sName[kouka]はmetafilter[1][kouka]となることに注意!!
今回は配列オブジェクトについて少しまとめてみますね。
★配列オブジェクトの作成。引数なし・・・var 配列オブジェクト名=new Array()
★Arrayを使用せずに要素を直接指定する・・・配列オブジェクト名=[要素1,要素2,要素3,・・・]
角カッコ[]で囲んで、コンマ,で各要素を区切ります。
★配列オブジェクトをインデックス最大番号で指定して作成(要素数はインデックス最大番号+1になります・・・var
配列オブジェクト名=new Array(iMax)
配列オブジェクトのlengthプロパティはiMax+1になります。
例)var cName=new Array(3)・・・cName[0],cName[1],cName[2],cName[3]の四つの要素を持つ。
★Arrayで作成、要素も指定する・・・var 配列オブジェクト名=new Array(要素1,要素2,要素3,・・・)
※Arrayとは?配列を示すオブジェクトです。Dateとは?日付オブジェクトです。
★配列オブジェクトの各要素を配列オブジェクトにすることも可能である。多次元配列的な使用ができる。
★二次元配列の要素代入方法2・・・直接要素を指定する方法(Arrayは使用しない)
var hairetu=[[要素0の0,要素0の1,要素0の2,・・・],[要素1の0,要素1の1,要素1の2,・・・]]
この場合は
hairetu[0][0]・・・要素0の0
hairetu[0][1]・・・要素0の1
hairetu[0][2]・・・要素0の2
hairetu[1][0]・・・要素1の0
hairetu[1][1]・・・要素1の1
hairetu[1][2]・・・要素1の2
のようになる。
★二次元配列では、最初の数字が行、二番目の数字が列となる。成績表であれば生徒の名前が行で、生徒それぞれに対応する各教科の成績が列というような使い方をするでしょう。
|
[0] |
国語[1] |
算数[2] |
理科[3] |
社会[4] |
|
さくら[0] |
3 |
1 |
1 |
2 |
|
あや[1] |
3 |
3 |
3 |
3 |
|
たく[2] |
5 |
5 |
5 |
5 |
|
みか[3] |
5 |
5 |
5 |
5 |
seiseki[0][0]="さくら",seiseki[1][0]="あや",seiseki[2][0]="たく",seiseki[3][0]="みか",seiseki[0][1]=3
次回予定:文字列の簡単な操作・歌詞表示