以下のコードを考えてみましょう。最初の console.log
はイメージを正しくログに記録し、そのイメージは下のイメージで確認できます。しかし、そのプロパティをコンソールにログオンすると、 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
コンソールの結果:
ここで何が起こっているか考えてみましょうか?また、 that.data [0]
の中の xml
プロパティもその内部にプロパティを持つ必要があります。/code>
FWIW、Firebugでも同じことが起こります(上記のコンソールイメージはChromeです)。
私は問題を解決しました。基本的に、問題のオブジェクト( that.data [0] .cards
)は、必要なすべてのAJAXリクエストの後に実行される関数 a()
XMLファイルが処理されました。 a()
をまだ呼び出す必要がある場合は、 success
コールバック関数で決定するためのカウンタを使用して、リクエストを非同期で実行できます。
a()
を実行した後、 b()
関数は that.data [i] .cards
で操作を実行することになっています。しかし、 a()
が非同期要求に依存しているため、 a()
が呼び出される前に b()
が実行されていました。だから、解決策は単に a()
を b()
にすることでした。
だから、これはかなり単純な間違いであった。それを紛らわしかったのは、コンソールに that.data [0] .cards
を記録すると、実際には cards
オブジェクトが実際にはそれはまだありませんでした。だからコンソールは間違った、あるいは少なくとも不明な情報を私に提供していた。
昨夜みんなの助けてくれてありがとう! Upvotesの周りに:)
オブジェクトキーには印刷できない文字があると思います。このように複製することができます:
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)] )
//[]
編集:これはあなたのオブジェクトキーの場合は表示されます:
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:あなたはそれを行うことができないので、私は印刷できない文字があるかどうかを調べる別の方法を思いついた:
このようなキー文字列をコピーしてください(両端にできるだけ長く移動して、目に見えない文字を選択してください)
次にクリップボードをこのようにダンプします(二重引用符を使用していることを確認してください)。