2010-11-18 4 views
0

Okみんなとギャル、この配列のキーを定義するにはどうすればよいですか?

私は完全にActionScript 3.0でXMLリファレンスを使って書かれた私のクライアントのすばらしいウェブサイトで働いています。以前のデザイナーは、まったく新しいものですが、cベースのプログラミングに精通している人にとってはおそらく通常の練習になるでしょう。とにかく、私は問題に直面しています...この配列defenitionに基づいて移入サブナビゲーションメニューがあります:一番上

subnavData = new Array({"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, 
{"title":"CREATIVE DIRECTION", "func":this.changeSlide, "param":this.showBranding, "childOf":0}, 
{"title":"SOCIAL INTERACTIVE", "func":this.changeSlide, "param":this.showOnline, "childOf":0}, 
{"title":"LIVE EVENTS", "func":this.changeSlide, "param":this.showLiveEvents, "childOf":0}, 
{"title":"CONTENT STRATEGY", "func":this.changeSlide, "param":this.showPerformance, "childOf":0}, 
{"title":"PROCESS", "func":this.changeSlide, "param":this.showProcess}, 
{"title":"CASE STUDIES", "func":this.changeSlide, "param":this.showCaseStudies}, 
{"title":"CLIENTS", "func":this.changeSlide, "param":this.showClients} 
      ); 

メニュー項目が子を持つ、したがって作ること、アレイ内の数字0 ..私はこれまでに動作するようになった唯一の方法は、 "childOf"を0に設定することでした。これは0の値ではなく0の文字列です。通常はPHPのプログラマーです。他の機能から登録しない0スポットへの参照の固有の傾向に特に問題がある。これは主に、ここでの問題です。文字列の宣言である '0'は、別の関数の反復処理では機能しません。数字が必要です.0は私のために機能しないため、メニューが勝ちました。私はそれを...それを設定すれば表示しません...参照してください?

私はこの配列の0ではなく1からどのように並べ替えを開始するかと思います。配列の各インスタンスが中括弧({})で囲まれているときに、どのように処理されるのかわかりません。 PHPで(ブレース値はPHPで受け入れられた場合、仮説的に)、私はこのような何かをするだろう:

subnavData = array(1 => {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, etc... );

が、フラッシュでこれをしようとしたとき:

subnavData = new Array(1 => {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, etc... );

それは何も得ていません。助けてください。ありがとう!

答えて

0

最初の配列の構文はちょっとファンキーです(フィールド名には文字列リテラルを使用しないでください。例:{ title: 'mytitle'}ではなく、{'title': 'mytitle'})、オブジェクトの有効な配列があります。

前述のように、Actionscriptでは、Arrayはカスタムキーを持つことができません。配列要素のキーは、配列の目的のスロットを指す整数だけです。 Objectは、obj.myPropNameまたはobj.titleのようなカスタムプロパティ名を使用できるデータ型です。

という配列の位置をずらさないでください。次の開発者だけがコードに触れることに混乱します。 :)

あなたのオブジェクトのchildOfプロパティが配列インデックスを参照することになっていると推測しています。そうだとすれば、有効なchildOfの値をチェックする問題が発生していると思います。あなたのような有効なchildOfプロパティの各オブジェクトをチェックし、配列を反復処理している場合はそう:

for(var i:int = 0, l:int = subnavData.length; i < l; i++) 
{ 
    if(subnavData[i].childOf) 
    { 
     trace(i + ' is child of ' + subnavData[i].childOf) 
    } 
} 

^は何も

をトレースしていない、あなたはどんな試合を取得することはありません。しかし、明確にあなたはchildOf = 0でいくつかのエントリがあります。ブール値if(subnavData[i].childOf)のチェックは、値がオブジェクトに存在しない場合、または00 == false)に設定されている場合は失敗します。 0undefinedの区別が必要です。チェックステートメントをif(subnavData[i].childOf != undefined)に変更することで、その区別ができます。

すなわち)私はあなたが達成しようとしているもので刺しを取って、私はあなたをトリップかもしれないものを見ると考えています

1 is child of 0 
2 is child of 0 
3 is child of 0 
4 is child of 0 

for(var i:int = 0, l:int = subnavData.length; i < l; i++) 
{ 
    if(subnavData[i].childOf != undefined) 
    { 
     trace(i + ' is child of ' + subnavData[i].childOf) 
    } 
} 

^をトレースします。うまくいけばそれは役に立ちます:)

+0

これはとても感謝しています。私はあなたの時間を感謝し、このショットを与えるでしょう。 – Lucas

0

私はあなたがここで何をしたいかについて完全にはわかりません。

しかし、1から数えてカウントを開始できる配列を作成する場合は、0要素を空の配列にすることができます。あなたも飛ばして、このような配列を読み込むことができ

something = subnavData[0][0]; 
someOtherThing = subnavData[0][1]; 
0

subnavData = new Array({}, {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, etc...); 

しかし、あなただけの多次元配列の要素にアクセスすると問題がある場合は、AS3でで行うための標準的な方法であります0:

var subnavData:Array = new Array(); 
subnavData[1] = {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}; 
subnavData[2] = {"title":"CREATIVE DIRECTION", "func":this.changeSlide, "param":this.showBranding, "childOf":0} 
subnavData[3] = etc... 

フラッシュの{}では、配列ではなくオブジェクトを作成します。したがって、値のオブジェクトを含む1次元配列を作成しています。だから、それは次のようになり、そのデータにアクセスするために:

subnavData[1].title; 
// or you can do this 
subnavData[1]['title'] 
0

を、アレイ内のものブレースは、新しいオブジェクトを表す:それはですので、通常ではないでしょうけれども

subnavData = new Array({"title":"OVERVIEW", "func":this.changeSlide}); 

も(このように書くことができます)冗長:

var navObject:Object = new Object(); 
navObject["title"] = "OVERVIEW"; 
navObject["func"] = this.changeSlide; 

subnavData = new Array(navObject); 

それは)いくつかの状況では、それは便利かも知れません(引用符なしオブジェクトキーを書くために実際にはより一般的ですか必要になります。

subnavData = new Array({title:"OVERVIEW", func:this.changeSlide}); 

以下ドット演算子と簡潔:

var navObject:Object = new Object(); 
navObject.title = "OVERVIEW"; 
navObject.func = this.changeSlide; 

subnavData = new Array(navObject); 
0

オブジェクトクラスはPHPではstdClassと同様、いくつかの方法で、AS3に基本クラスです。 2つの方法で新しいオブジェクトを作成できます。

object.title = "OVERVIEW"; 
    // or this 
    object = {title: "OVERVIEW" , ...}; // as in your example 

    //you could also use the Array notation 
    //but it is believed to be a lot slower 
    object["title"] = "OVERVIEW"; 

は、あなたが本当にArrayで混乱する必要はありませんが、あなたがに慣れていないなら、あなたは簡単にchildOfプロパティを変更することができます。

var object:Object = new Object(); 
    var object:Object = {}; 

あなたはこのように、動的にプロパティを割り当てることができます0の値。あなたのケースでは、0は整数であるので、あなたは、オブジェクトのプロパティを通して反復処理するとき、次のように動作するはずです:

for each(var obj:Object in subnavData) 
    { 
     if(obj.childOf == 0) 
      //do whatever 

    } 

をしかし、あなたは、インスタンスのchildOfプロパティに「概要」に変更した場合、あなたはこれを行うことができます:

for each(var obj:Object in subnavData) 
    { 
     if(obj.childOf == "OVERVIEW") 
     //do whatever    
    } 

実際にchildOfプロパティを快適なものに変更します(ただし、他の場所では使用されていないことはもちろんですが、配列インデックス作成の場合も同様です)。ここで働くはずです。配列を反復処理するときに使用するコードの例を投稿できますか?