Consider the code below. The first console.log
correctly logs the image, and you can see its properties in the image below. However, when I try logging one if its properties to the console, I get undefined
!
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
The result in the console:
Any idea what's going on here? The xml
property inside of that.data[0]
should also have properties inside of it -- named the same, in fact, as the properties in cards
.
FWIW, I get the same thing in Firebug (the above console image is Chrome).
I think the object keys have unprintable characters, such can be replicated like this:
Edit: you can see if this is the case for your object keys:
Edit2: Since you can't do that I came up with another way to see if there are unprintable characters:
Copypaste the key string like this: (go all the way as much as you can on both ends so you pick any invisible characters)
Then dump your clipboard like this (Make sure you are using double quotes):
I've solved the problem. Basically, the object in question (
that.data[0].cards
) has its properties created by a functiona()
that runs after all the AJAX requests for the necessary XML files have been processed. I allow the requests to run asynchronously, using a counter to determine in thesuccess
callback function ifa()
should be called yet.After
a()
runs, functionb()
is supposed to perform operations onthat.data[i].cards
. However,b()
was running prior toa()
being called because ofa()
's reliance on the asynchronous requests. So the solution was simply to makea()
callb()
.So this turned out to be a pretty simple mistake on my part. What made it so confusing was the fact that logging
that.data[0].cards
to the console showed me that in fact thecards
object had already been built, when in fact it had not yet. So the console was providing me with incorrect--or at least unclear--information.Thanks for everyone's help last night! Upvotes all around :)