Bu nesne özelliği neden tanımlanmamış?

Aşağıdaki kodu dikkate alın. İlk console.log görüntüyü doğru bir şekilde kaydeder ve aşağıdaki görüntüdeki özelliklerini görebilirsiniz. Ancak, konsoldaki özellikleriyle bir tane oturum açmayı denediğimde undefined (kod) aldım!

console.log(that.data[0].cards); //works -- see image below
console.log(that.data[0].cards.E); //undefined
console.log(that.data[0].cards['E']); //undefined
console.log(that.data[0].cards.hasOwnProperty('E')); //false

var test = JSON.stringify(that.data[0]);
console.log(test);//{}

for( var key in that.data[0].cards ) {
    console.log('hello????') //doesn't appear in the console
}

console.log( Object.keys( that.data[0].cards ) ); //[]
console.log( that.data[0].cards.propertyIsEnumerable("E") ); //false
console.log( that.data[0].cards.__lookupGetter__( "E" ) ); //undefined

Konsoldaki sonuç:

enter image description here

Burada neler olduğu hakkında bir fikrin var mı? that.data [0] öğesinin içindeki xml özelliğinin içinde de özelliklere sahip olması gerekir - aslında, kartlarında <özellikler> olarak adlandırılır./code>.

FWIW, Firebug'da da aynı şeyi alıyorum (yukarıdaki konsol resmi Chrome'dur).

11
JSON.stringify (that) , komut dosyasını tam olarak durdurmak dışında herhangi bir şey yapmıyor gibi görünüyor. Hata veya başka bir şey atmaz, ancak JSON.stringify (that) çağrısından sonra hiçbir şey çalışmaz. Sorgumu JSON.stringify (that.data [0] .cards) sonucunu göstermek için güncelledim. Bu sadece boş bir nesne olduğunu gösteriyor {} .
katma yazar maxedison, kaynak
Resmi güncelledim.
katma yazar maxedison, kaynak
Bu sefer nesnenin gerçekten boş olmadığından emin misin? Genişlemedin ...
katma yazar pimvdb, kaynak
Teşekkürler. Hala çoğalamıyorum. jsfiddle.net 'de basitleştirilmiş, yalıtılmış bir test örneği sunabilir misiniz?
katma yazar pimvdb, kaynak
Davranışı çoğaltamazsak size yardımcı olamam. JSON'u sağlayabilir misin?
katma yazar aziz punjani, kaynak
JSON.stringify (bu) sonucunu iletebilir misiniz?
katma yazar FreeCandies, kaynak

2 cevap

Sorunu çözdüm. Temel olarak, söz konusu nesne ( that.data [0] .cards ), gerekli tüm AJAX isteklerinden sonra çalışan bir a() işlevi tarafından oluşturulan özelliklere sahiptir. xml dosyaları işlendi. İsteklerin, a() çağrısı yapılması gerekiyorsa başarılı geri arama işlevini belirlemek için bir sayaç kullanarak eşzamansız olarak çalışmasına izin veriyorum.

a() çalıştırıldıktan sonra b() işlevinin that.data [i] .cards üzerinde işlem gerçekleştirmesi beklenir. Ancak b() , a() 'in asenkronize isteklere bağımlı olması nedeniyle a() çağrılmadan önce çalışıyordu. Böylece çözüm sadece a() çağrısı b() yapmaktı.

Yani bu benim üzerimde oldukça basit bir hata olduğu ortaya çıktı. Ne kadar kafa karıştırıcı yapan şey, bu .data [0] .cards 'un konsola kaydedilmesinin aslında kartlar nesnesinin daha önceden oluşturulduğunu gösterdi. aslında henüz yoktu. Yani konsol bana yanlış ya da en azından belirsiz bilgi veriyordu.

Dün gece herkesin yardımına teşekkürler! Etrafında upvotes :)

12
katma
başka bir gizem çözüldü :)
katma yazar Esailija, kaynak
Bugün aynı problemle karşılaştım. Teşekkürler.
katma yazar rr-, kaynak

Nesne tuşlarının yazdırılamayan karakterleri olduğunu düşünüyorum, bu şekilde şöyle çoğaltılabilir:

var obj = {};
obj["E"+String.fromCharCode(15)] = new Array(15);

console.log(obj);

/*Object
E: Array[15]
__proto__: Object*/

console.log(obj.E)

//undefined

console.log( obj["E"+String.fromCharCode(15)] )

//[]

Düzenle: nesne anahtarlarınız için durumun böyle olup olmadığını görebilirsiniz:

var realKeys = [];

for( var key in obj ) {
realKeys.push( [].slice.call( key ).map( function(v){return v.charCodeAt(0);} ).join(" ") );
}

//["69 15"] (69 stands for the letter "E" and 15 was the unprintable character I added manually)

Edit2: Bunu yapamayacağınız için, yazdırılamayan karakterler olup olmadığını görmek için başka bir yol buldum:

Anahtar dizeyi şu şekilde kopyalayın: (her iki ucunda da olabildiğince çok ilerleyin, böylece görünmez karakterler seçin)

Ardından panoya böyle dökün (Çift tırnak kullandığınızdan emin olun):

7
katma
Aynı sonucu üretiyor gibi görünüyor. Ben yaptım: console.log (that.data [0]. Kartları ['E' + String.fromCharCode (15)]) & zwnj;;
katma yazar maxedison, kaynak
JSON.stringify (that.data [0]) şunları üretir: {"session": "01", "xml": {}, "cards": {}} . Gerçek şu ki, xml nesnesinin, içinde kartları nesnesiyle aynı şekilde adlandırılmış özellikleri de olmalıdır. Ayrıca, sorunuzu önerdiğiniz için sonuçlarının içeriklerini de içerecek şekilde güncelledim, ancak yayınlanamıyor.
katma yazar maxedison, kaynak
Bunun sonucunu göstermek için yayınımı güncelledim. Sayfayı siteye bağlayamıyorum çünkü yerel olarak gelişimi yapıyorum. Bu, programlamada karşılaştığım en garip şeylerden biri.
katma yazar maxedison, kaynak
Nesne, dinamik verileri (jQuery kullanarak) yükleyen AJAX istekleri aracılığıyla dinamik olarak oluşturulur. Tüm veriler yüklendikten sonra, (jQuery kullanılarak) ayrıştırılır. Bu noktada sözde "tanımsız" diziler (cards.E, card.N, card.X) oluşturulur. En son düzenlemenizi sabah saatlerinde deneyeceğim. Yardımınız için teşekkürler.
katma yazar maxedison, kaynak
@macedison: Ve @ Esailija'nın sebebi nedeniyle, lütfen JSON.stringify (that.data [0]) sonucunu kopyalayın/yapıştırın, böylece araştırılabilir
katma yazar pimvdb, kaynak
Çünkü nesnenizin String.fromCharCode (15) 'den farklı görünmez karakteri olabilir, 3, 24 ya da 22 olabilir.
katma yazar Esailija, kaynak
console.log'u (Object.keys (that.data [0] .cards)) deneyin; . Bu işe yaramazsa, console.log (this.data [0] .cards.propertyIsEnumerable ("E")) deneyin; Bu işe yaramazsa, console.log işlevini deneyin. .data [0] .cards .__ lookupGetter __ ("E")); Eğer işe yaramıyorsa sadece sayfaya link: D
katma yazar Esailija, kaynak
Nesneyi nasıl yaratıyorsunuz, nereden geliyor? Temiz bir sayfada izole ettiniz mi?
katma yazar Esailija, kaynak