2012-02-09 30 views
1

MovieClipsの連想配列を作成しましたが、繰り返し処理しようとするとforループは決して入力されません(何も出力されません)。配列が空の場合と同じです。オブジェクトの配列を反復する

アイデア?

var navItems:Array = new Array(); 
navItems["home"] = item_home; 
navItems["featuredfilms"] = item_featuredfilms; 
navItems["nowshowing"] = item_nowshowing; 
navItems["trailers"] = item_trailers; 
navItems["comingsoon"] = item_comingsoon; 
navItems["yourtickets"] = item_yourtickets; 

function registerNavigationEvents():void { 
    for (var item in navItems) { 
     trace("Hello"); 
     //item.addEventListener(MouseEvent.MOUSE_OVER, handleNavToggle); 
    } 
} 

辞書:

var navItems:Dictionary = new Dictionary(); 
navItems["featuredfilms"] = item_featuredfilms; 
navItems["nowshowing"] = item_nowshowing; 
navItems["trailers"] = item_trailers; 
navItems["comingsoon"] = item_comingsoon; 
navItems["yourtickets"] = item_yourtickets; 

function registerNavigationEvents():void { 
    for(var key:String in navItems) { 
     trace("Hello"); 
     //item.addEventListener(MouseEvent.MOUSE_OVER, handleNavToggle); 
    } 
} 

答えて

0

あなたのアレイに追加するpush()機能を使用します。

navItems.push(item_home); 
//... 
navItems.push(item_yourtickets); 

配列は、データを取得するために、数値インデックスを使用しています。あなたが検索のための文字列を使用する連想コンテナを持っているしたい場合、Dictionaryクラスに見て:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Dictionary.html

+0

今のところNevermind: – Nick

2

はこれを試してみてください:

for (var key:String in navItems) { 
    var mc:MovieClip = navItems[key] as MovieClip; 
    // do stuff here 
} 

または:すべての

for each (var item:MovieClip in navItems) { 
    // do stuff here 
} 
0

まず、それを私にはあなたの問題はあなたが実際に電話することはないということです。registerNavigationEvents() ...

とにかく、連想配列を作成したい場合は、 ObjectまたはDictionaryのいずれかを使用します。 Arrayにはデフォルトで数値インデックスがあります。

あなたはfor...inを使用して結合型の両方のキー以上反復をすることができ、彼らはそのDictionaryで主に異なるObjectは文字列のみを受け入れながら、キーとして任意のオブジェクトを受け付けます。

var obj:Object = {}; 
for (var key : String in obj) { 
    var value : Object = obj[key]; 
} 

var dict:Dictionary = new Dictionary(); 
for (var key : Object in dict) { 
    var value : Object = dict[key]; 
} 

いくつかのより多くの違いがあり、それについてhereまたはAS3 docについて読むことができます。

あなたはあなたのコード内で行ったように、ブラケット演算子を使用して値を割り当てるか、ドット構文を使用することができます。

obj.key = value; // same as obj["key"] = value; 
dict.key = value; // same as dict["key"] = value; 

明らかにかかわらず、これはすべての辞書のキーは、同様に、文字列になることを意味します。ドットシンタックスを使用すると、実際にはObjectとまったく同じように辞書が使用されることに注意してください。 Dictionaryから得られるスピードブーストは、オブジェクトポインタをキーとして使用することで実現されます。これは、文字列や数値では実行できません。

あなたは反復配列はfor each...inを使用して値ことができます。

var array:Array = []; 
for each (var item:Object in array) { 
    // item can also have strong typing, it will be cast automatically 
} 

これはまた、辞書やオブジェクトに対して動作します。ただし、は、値が返される順序についてはわかりません

+0

あなたは正しいのですが、それは彼らの行動ですが、彼らが辞書の鍵にならないということを意味するわけではありません。それは動作しない数字と文字列が混在しています。 – weltraumpirat

+0

それはまったく意味がありません。文字列キーとオブジェクトキーの2つの項目を辞書に追加し、 'for(var key:Object in dict)trace(dict [key]);'を実行します。 。あなたはメモリの割り当てがまったく違うと思いますか?あなたにはその源がありますか? – weltraumpirat

+0

よろしくお願いいたします。ソースコードを見て、私は今日何か新しいことを学んだことを認めなければなりません...自分の投稿を編集してそれを反映させ、あなたが自分の投稿を追加すれば+1します。 – weltraumpirat

0

まず、用語を整理すると、いいえ、結合配列は作成されませんでした。 AS3は、連想配列の実装を提供していません。連想配列は、キーと値のペアのシーケンスです(シーケンスは要素の順序を定義するという点でセットとは異なります)。ペアがユニークであるシーケンスは必要ありません(配列はシーケンスの特定のケースであり、配列には同じエレメントが複数回含まれるのが一般的です)。連想配列は同じ要素を複数回含むことがあります。典型的な例は、次のようなものを含むget要求です:example.org/?foo=bar&foo=bar

ここで、作成したものは、他のオブジェクトのセットにマッピングされる一連の文字列キーと考えることができます。すべての文字列は一意にする必要があります。一般に、他の言語では、この構造体はマップと呼ばれます。しかし、mapは特定の慣習的な実装を意味します。マップには通常、メモリ割り当て、高速アクセスのためのキーのハッシュ、マップに含まれる項目の数の計算などの特別な方法があります。マップをツリーとして実装することは珍しいことではありません。

最後に、ダイナミッククラスのインスタンスを作成し、それにいくつかのプロパティを追加しました。物事をさらに複雑にする:)クラスのプロパティは文字列ではありません!それらはQName(修飾名)です。私。名前空間と文字列キーのペア。これらのプロパティをバックアップするメカニズムはマップと非常によく似ていますが、実際のマップとして使用するコントロールはすべて与えられていません。

私は、ビューの「コンピュータ」の点から、よりストレートな方法は、いずれかの配列を使用することであろうことを確信させるために、このすべてを説明してきました:

var navItems:Array = [item_featuredfilms, item_nowshowing, 
    item_trailers, item_comingsoon, item_yourtickets]; 

その場合、後で缶に配列のオフセットである各要素navItems[x],xを参照してください。この配列のfor-forループとfor-eachループを使用して、それぞれキーと値を反復することができます。

また、あなたは辞書を使用することができ、しかし、あなたはもともとやった方法ではない:

再び
var navItems:Dictionary = new Dictionary(); 
navItems[item_featuredfilms] = "featuredfilms"; 
. . . 
navItems[item_yourtickets] = "yourtickets"; 

、後であなたがのために、内のキーを反復処理でき(キーはオブジェクトではなく文字列です) 、for-each(この例の値は文字列)を使用して値を上書きします。

どちらを選択するかはあなた次第です。あなたが検討しなければならない要素は次のとおりです。Array.indexOf()は、最悪の場合、探している要素インデックスを見つけるために最悪の場合、配列の各要素を調べる必要があるため、O(n)操作です。dictionary[key]はO 1)操作を行う。しかし、オブジェクトをキーで見つけ出す必要がある場合は、正反対です。array[index]はO(1)操作ですが、必要なキーを見つけるために辞書をループする必要があります。

private function iterateTest():void 
{ 
    var dictionary:Dictionary = new Dictionary(); 
    var array:Array = []; 

    // Array is a complex type, thus, it will be used 
    // by reference, and it is OK to use it as 
    // dictionary keys 
    var one:Array = ["one"]; 
    var two:Array = ["two"]; 
    var three:Array = ["three"]; 

    var key:Object; 
    var value:Object; 

    dictionary[one] = 1; 
    dictionary[two] = 2; 
    dictionary[three] = 3; 

    // note, you could do this in plenty of ways, 
    // for example: array.push(one, two, three) 
    // or array = [one, two, three] 
    // I did it like this for consistency of this example only. 
    array[1] = one; 
    array[2] = two; 
    array[3] = three; 

    for each (value in dictionary) trace(value); 
    for (key in dictionary) trace(key, dictionary[key]); 

    for each (value in array) trace(value); 
    for (key in array) trace(key, array[key]); 

    // Output: 
    // 1 
    // 2 
    // 3 
    // one 1 
    // two 2 
    // three 3 
    // one 
    // two 
    // three 
    // 1 one 
    // 2 two 
    // 3 three 
} 

出力にあなたが数字を参照してくださいどこの出力にあなたは枢機卿を見るたびに、実際の数は、複雑なオブジェクトを使用した、コードで使用されました。

関連する問題