2010-11-18 19 views
0

Ok adamlar ve gals,Bu dizinin anahtarını nasıl tanımlarım?

İstemcimin inanılmaz bir web sitesiyle birlikte çalışıyorum ve tamamen xml referansları içeren actionscript 3.0'da yazdım. Bir önceki tasarımcı, benim için tamamen yeni olan, ancak muhtemelen c-tabanlı programlamayı bilenler için normal bir uygulama olan bir zihin-çatışması (benim için) oluşturdu. nasıl olsa, bu yüzden bir sorunla karşı karşıya am ... Bu dizi defenition dayalı dolduran bir alt navigasyon menüsü vardır: üstte

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} 
      ); 

menü öğesi çocuğu var, dolayısıyla yapım o dizideki sayısı 0 .. Şimdiye kadar çalışmamın tek yolu "childOf" değerini "0" olarak ayarlamak, yani 0 değeri değil, 0 değeri değil. Normalde bir php programcısıyım. Diğer işlevlerden kayıt olmamak için 0 noktasına referanslar için doğal eğilim ile özellikle sorun. Yani, buradaki konu öncelikli olarak, '0' dize bildirimi, başka bir fonksiyonda yinelemeli bir süreç için çalışmadığından, bir sayı beklediğinden ve 0 benim için çalışmadığından, menü kazandı Onu şöyle ayarlayabilir miyim?

Yani merak ediyorum, bu dizide 0 yerine 1'den nasıl sipariş verebileceğimi merak ediyorum. Dizideki her örnek parantez içinde ({}) bulunduğunda bunun nasıl yapıldığını bilmiyorum.

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

ama flaş Bu çalışırken:

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

hiçbir şey verir php, ben böyle bir şey (hazırladı değerler php tarafından kabul edildiği takdirde, varsayımsal) yapardı. lütfen yardım et. Teşekkürler!

cevap

0

İlk dizininizin sözdizimi biraz korkak olsa da (kural, alan adları için dize değişmezlerini kullanamaz. Örneğin { title: 'mytitle'}, {'title': 'mytitle'}), geçerli bir nesne diziniz vardır.

Daha önce bahsedildiği gibi, Actionscript'te, bir Array özel anahtarlara sahip olamaz; Dizi elemanları tuşları, dizideki istenen yuvaya işaret eden tam sayılardır. Object, obj.myPropName veya obj.title gibi özel özellik adlarını kullanmanıza izin veren veri türüdür.

Dizi konumlandırmasını kesip atmaya kalkmayın, yalnızca sonraki geliştiriciyi kodlara dokunmak için karıştırırsınız! :)

Snippet'inizden, nesnelerinizdeki childOf özelliğinin bir dizi dizinine başvurması gerektiğini tahmin ediyorum. Eğer öyleyse, geçerli bir childOf değerini kontrol etmek için konulara koştuğunuza bahse girerim.Bunu gibi geçerli childOf özellik için her objeyi kontrol dizisi yineleme ediyorsanız:

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

^o zaman herhangi bir eşleşme almazsınız hiçbir şey

izler. Ama açıkça bir childOf = 0 ile birkaç girişiniz var. Değer, nesne üzerinde yoksa veya 0 (0 == false) olarak ayarlanmışsa, boole if(subnavData[i].childOf) denetimi başarısız olur. 0 ve undefined arasında bir ayrım yapmanız gerekir. Check ifadenizi if(subnavData[i].childOf != undefined) olarak değiştirerek bu farkı yaratabilirsiniz.

yani) Sana başarmak için çalışıyoruz ne bir bıçak alarak ama seni Tökezleme ne olabileceğini görüyorum am

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) 
    } 
} 

^izler. Umarım bu yardımcı olur :)

+0

çok teşekkür ederim ... bu en mantıklı gibi görünüyor. Zaman ayırdığınız için teşekkür ederim. – Lucas

0

Burada ne yapmak istediğinizden emin değilim.

Ancak, 1'den saymaya başlayabileceğiniz bir dizi oluşturmak istiyorsanız, 0 öğesinin boş bir dizi olmasını sağlayabilirsiniz. Sadece çok boyutlu dizideki öğeleri erişme ile sorun yaşıyorsanız

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

Ama AS3'te yapmak standart bir yoludur:

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

ayrıca, böyle diziyi yük atlama olabilir 0:

Ve bu arada, flaş {} bir nesne değil, bir nesne oluşturur. Yani değerler için nesnelerle 1 boyutlu bir dizi yapıyorsunuz.dizinin içinde

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

bu destekler yeni bir Object temsil: Yani şu şekilde görünecektir o verilere erişmek için

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

ayrıca beri genellikle olmaz gerçi (böyle yazılmış olabilir ) ayrıntılı:

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

subnavData = new Array(navObject); 

o) bazı durumlarda yararlı olabilir gerçi (tırnaklar olmadan nesne anahtarlarını yazmak için aslında daha yaygındır ya gereklidir:

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

veya nokta operatörüyle az terse:

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

subnavData = new Array(navObject); 
0

Nesne sınıfı PHP'de stdClass benzer bazı açılardan, AS3 taban sınıfıdır. İki şekilde yeni bir Nesne oluşturabilirsiniz.

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"; 

Gerçekten Array bulaşmak gerekmez, ancak rahat değilseniz kolayca childOf özelliğini değiştirebilirsiniz:

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

Böyle dinamik özelliklerini atayabilirsiniz 0 değeri. senin durumda, 0 bir tamsayı, yani nesneler özellikleri aracılığıyla yineleme zaman, aşağıdaki çalışması gerekir:

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

    } 

Ama mesela childOf özelliğini "GENEL" değiştirirseniz, bu yapabilirdi:

bir tamsayı 0 kullanımı her ne kadar
for each(var obj:Object in subnavData) 
    { 
     if(obj.childOf == "OVERVIEW") 
     //do whatever    
    } 

Pratik, siz (!!! aynı yoluyla Dizi endeksleme için de geçerli başka bir yerde kullanılıyor değil tabii koşuluyla) memnunsanız ne kadar childOf özelliğini değiştirmek burada çalışmalı. Array üzerinden yinelediğinizde kullandığınız kodun bir örneğini gönderir misiniz?

İlgili konular