このオブジェクトのプロパティが定義されていないのはなぜですか?

以下のコードを考えてみましょう。最初の 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

コンソールの結果:

enter image description here

ここで何が起こっているか考えてみましょうか?また、 that.data [0] の中の xml プロパティもその内部にプロパティを持つ必要があります。/code>

FWIW、Firebugでも同じことが起こります(上記のコンソールイメージはChromeです)。

11
JSON.stringify(その)は、スクリプトを完全に停止させる以外は何もしないようです。エラーやその他のエラーは発生しませんが、 JSON.stringify(that)の呼び出し後は何も実行されません。私は、 JSON.stringify(that.data [0] .cards)の結果を表示するように質問を更新しました。これは空白のオブジェクト {}
追加された 著者 maxedison,
イメージを更新しました。
追加された 著者 maxedison,
今回はオブジェクトが本当に空ではないと確信していますか?あなたはそれを展開していない...
追加された 著者 pimvdb,
ありがとう。私はまだ再現できません。おそらく、 jsfiddle.net で簡素化された独立したテストケースを提供できますか?
追加された 著者 pimvdb,
あなたが行動を再現できない場合、あなたを助けることはできません。あなたはJSONを提供できますか?
追加された 著者 aziz punjani,
JSON.stringify(that)の結果を渡すことはできますか?
追加された 著者 FreeCandies,

2 答え

私は問題を解決しました。基本的に、問題のオブジェクト( 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の周りに:)

12
追加された
別の謎が解決:)
追加された 著者 Esailija,
私は今日同じ問題に遭遇しました。ありがとう。
追加された 著者 rr-,

オブジェクトキーには印刷できない文字があると思います。このように複製することができます:

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:あなたはそれを行うことができないので、私は印刷できない文字があるかどうかを調べる別の方法を思いついた:

このようなキー文字列をコピーしてください(両端にできるだけ長く移動して、目に見えない文字を選択してください)

次にクリップボードをこのようにダンプします(二重引用符を使用していることを確認してください)。

7
追加された
同じ結果を生み出すと思われる。私はしました: console.log(that.data [0] .cards ['E' + String.fromCharCode(15)])‌;
追加された 著者 maxedison,
{"session": "01"、 "xml":{}、 "cards":{}} を生成します。 JSON.stringify(that.data [0] 。真実は、 xml オブジェクトもその内部に cards オブジェクトと同じ名前のプロパティを持つ必要があるということです。あなたが提案した for ループの結果を含めるように質問を更新しましたが、実行されていないようです。
追加された 著者 maxedison,
私はそれの結果を示すために自分の投稿を更新しました。私は開発をローカルでやっているので、ページにリンクできません。これは私がプログラミングで遭遇した最も奇妙なことの一つです。
追加された 著者 maxedison,
このオブジェクトは、(jQueryを使用して)XMLデータをロードするAJAXリクエストを介して動的に作成されます。すべてのデータがロードされると、解析されます(再び、jQueryを使用して)。おそらく、未定義の配列(cards.E、cards.N、card.X)が作成されるのはこの時点です。私はあなたの最新の編集を午前中に試してみます。ご協力いただきありがとうございます。
追加された 著者 maxedison,
@macedison:@ Esailijaの理由から、 JSON.stringify(that.data [0])の正確な結果をコピーして貼り付けて、調査できるようにしてください
追加された 著者 pimvdb,
あなたのオブジェクトは String.fromCharCode(15)とは違った目に見えない文字を持つ可能性があるため、3、24、22などとなります:)
追加された 著者 Esailija,
console.log(Object.keys(that.data [0] .cards)); を試してください。それでも動かない場合は、 console.log(that.data [0] .cards.propertyIsEnumerable( "E")); .data [0] .cards .__ lookupGetter __( "E")); それがうまくいかない場合は、ページへのリンク:D
追加された 著者 Esailija,
どのようにオブジェクトを作成していますか、それはどこから来ていますか?きれいなページでそれを分離しましたか?
追加された 著者 Esailija,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript