- ベストアンサー
配列のlengthの意味
- 配列のlengthプロパティの意味と連想配列の扱いについて質問です。
- 配列には普通の要素と連想配列の要素が混ざっている場合、連想配列の要素はlengthに反映されません。
- 連想配列の要素数を調べる方法を知りたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
いわゆる配列変数として、Array クラスのプロパティやメソッドで並び替えや値の検索といった配列変数ならではの機能を発揮できるのは、数字でインデックスを付けたものだけです。 配列変数を扱う Array クラスは MovieClip クラスなどと同様に、プロパティやメソッドを後から追加できるクラス(ダイナミッククラス)です。 [ ] の中に数字以外の名前を指定した場合は、その名前のプロパティが作成されます。こちらは配列変数とは見なされません。 ActionScript の [ ] 演算子は、配列変数の操作と、文字列を参照に変換するという、2つの機能があります。 配列変数の操作には [ ] が使われるために、arr[ "川" ] も配列変数になるような気がするのですが、これは、"川"の文字列を参照に変換してこの名前のプロパティを参照するという意味です。プロパティが存在しない場合は、新たに作成されます。 つまり、ご提示の例ですと、arr は [ 0 ] ~ [ 2 ] の要素を持つ配列変数を管理すると同時に、そのほかに「川」「魚」「鳥」という名前のプロパティを持っていることになります。 この中で、いわゆる配列変数として機能し、Array クラスのプロパティやメソッドを適用できるのは、arr[ 0 ] ~ arr[ 2 ] の部分だけです。 length は配列変数の要素数を表します。数字以外で命名された「川」や「鳥」はプロパティであって配列変数の要素とは見なされないので、arr.length は 3 となります。 「川」や「鳥」は配列変数ではないものの、arr の持つプロパティではあるのですから、 arr[ "川" ] と、文字列を [ ] 演算子で参照に変換すると値を取り出すことができます。 プロパティの名前が全角文字なので意外ですが、実は arr.川 でも参照できます。 ただ、エラーにはならなくても、スクリプトで制御するものの名前に全角文字は、避けた方が無難です。 - - - - - ActionScript には、連想配列の発想がありません。 しかし、Object クラスか、ActionScript 3.0 であれば#1の方がおっしゃる通り Dictionary というクラスを使い、連想配列を擬似的に表現することはできます。 先ほどの件も、連想配列という1つのデータ管理形態があったのではありません。Array クラスのオブジェクトに作られた、独立したプロパティの1つ1つにそれぞれ値が入っていて、そのプロパティの名前が連想配列のキーのような役割を果たしていたのです。 Object クラスを使う場合も、キーの名前のプロパティを作る形になります。 (↓ 各行頭に全角のスペースが含まれています。コピーする際はご注意ください) //*** var obj:Object = new Object(); obj.earth = "地球"; obj[ "sun" ] = "太陽"; //値を出力 for( var key:String in obj ) { trace( "キー:" + key + " 値:" + obj[ key ] ); } //*** ↑ オブジェクトに含まれるプロパティの名前に規則性がなくても、for in という制御文を使って列挙することは可能です。(列挙できないものもあります) プロパティの総数を返すメソッドはないのですが、for in の中でカウントを取ると総数を調べることができます。 このような使い方は、例えば生徒の名前と住所というように、重複しない固有のキーと値をペアにして管理したい時に向いています。 なお、ActionScript 1.0 と 2.0 では、for in は後に入れたものの方から先(上記の例では sun → earth の順)に取り出される場合があります。取り出す順序が重要になる時はご注意ください。 - - - - - これとは別に、配列変数の持っている”フィールド”という機能を使って、複数の情報を組にして管理することもできます。 //*** var arr:Array = new Array(); arr = [ { en : "earth" , jp : "地球" } , { en : "sun", jp : "太陽" } ]; //別の書き方で追加してみる arr[ 2 ] = { en : "moon" , jp : "月" }; //配列変数の要素を全てチェック for( var i:Number = 0 ; i < arr.length ; i++ ) { //各フィールドの値を出力 trace( "arr[ " + i + " ].en = " + arr[ i ].en ); trace( "arr[ " + i + " ].jp = " + arr[ i ].jp ); } //*** ActionScript の配列変数は、各要素の中にさらに仕切りを作り、1つの要素で複数の情報を管理できるようになっています。 この仕切りのことを”フィールド”といい、{ } を使って { フィールド名 : 値 , … } というように複数のフィールドをまとめて定義することもできます。 フィールド名と値の数は統一されていなくても構いませんが、全ての要素間で統一しておくと、何かと便利です。 上記の例では arr は配列変数になりますから、Array クラスの持つ機能を活かすことができます。 (ちなみに Array クラスの sortOn メソッドは、フィールドごとの値に注目して並べ替えることができます) この使い方は、複数のデータの間に共通の項目名を設けて値を持つ、表やデータベースのようなものに向いています。Flash でも、ComboBox や DataGrid など、データを表のように表示するタイプのコンポーネントでのデータの管理に利用されています。 上記の例の arr は全部で6つの情報を管理しているように見えますが、実際は、arr に含まれる [ 0 ] ~ [ 2 ] の3つの要素がそれぞれ” en ”と jp ”というプロパティを持って値を管理している形になります。 arr の length プロパティは、あくまでも自分が持っている配列変数の要素( [ 0 ] ~ [ 2 ] )の総数を表すので、arr.length は 3 です。
その他の回答 (1)
- H240S18B73
- ベストアンサー率65% (190/288)
AS3で連想配列はDictionaryクラスになります Dictionaryはオブジェクトの参照もキー値にできます
お礼
Dictionaryクラス、初めて知りました! 便利そうですね、いじってみます☆ ありがとうございました!
お礼
非常にご丁寧かつわかりやすいご説明、ありがとうございます! とっても良く理解できました、なるほど~。 感謝いたします、ありがとうございます!