Чому цей об'єкт властивий невизначеною?

Розглянемо код нижче. Перший 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

Будь-яка ідея, що тут відбувається? Властивість xml всередині that.data [0] також повинно мати властивості всередині нього - називається тим самим, насправді, як властивості в card .

FWIW, я отримую те ж саме в Firebug (наведене вище консольне зображення Chrome).

11
JSON.stringify (that) , схоже, нічого не робить, за винятком приведення сценарію до повної зупинки. Не викидає помилку або нічого, але нічого не відбувається після виклику до JSON.stringify (that) . Я оновив своє запитання, щоб показати результати JSON.stringify (that.data [0] .cards) , що лише показує його як порожній об'єкт () .
додано Автор maxedison, джерело
Я оновив зображення.
додано Автор maxedison, джерело
Ви впевнені, що цей об'єкт насправді не порожній? Ви не розширили його ...
додано Автор pimvdb, джерело
Дякую. Я все ще не можу розмножуватися. Не могли б ви подати спрощений, ізольований тестовий приклад на jsfiddle.net ?
додано Автор pimvdb, джерело
Не можемо вам допомогти, якщо ми не зможемо повторити поведінку. Чи можете ви надати JSON?
додано Автор aziz punjani, джерело
Чи можете ви пройти результат JSON.stringify (що)?
додано Автор FreeCandies, джерело

2 Відповіді

Я вирішив цю проблему. В основному, об'єкт, про який йде мова ( that.data [0] .cards ) має свої властивості, створені функцією a() , яка виконується після всіх запитів AJAX для необхідного Файли xml оброблені. Я дозволяю ці запити запускати асинхронно, використовуючи лічильник для визначення функції зворотного виклику success , якщо ще потрібно викликати a() .

Після запуску a() функція b() повинна виконувати операції на that.data [i] .cards . Проте, b() було запущено до виклику a() через те, що a() залежить від асинхронних запитів. Таким чином, рішення було просто зробити виклик a() b() .

Отже, це виявилося досить простою помилкою з мого боку. Що викликало це настільки заплутане враження, що протоколювання that.data [0] .cards до консолі показало мені, що насправді об'єкт cards вже був побудований, коли в Фактично це ще не було. Тож консоль надавав мені неправильну інформацію - або принаймні незрозумілу.

Дякуємо за вашу допомогу минулої ночі! Піднімайте все навколо :)

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)]) & nbsp;
додано Автор maxedison, джерело
JSON.stringify (that.data [0]) виробляє: {"сеанс": "01", "xml": {}, "карти": {}} . Справа в тому, що об'єкт xml має також мати властивості всередині нього, називаючи його тим самим, що й об'єкт cards . Я також оновив своє запитання, щоб включити результати запропонованого циклу for , але воно, схоже, навіть не запускається.
додано Автор maxedison, джерело
Я оновив свій пост, щоб показати результат цього. Я не можу посилатися на сторінку, тому що займаюся розробкою локально. Це легко одне з найдивніших речей, які я коли-небудь стикався в програмуванні ...
додано Автор maxedison, джерело
Об'єкт створюється динамічно за допомогою запитів AJAX, які завантажують дані xml (використовуючи jQuery). Коли всі дані завантажуються, вони аналізуються (знову ж таки, використовуючи 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")); Якщо це не працює, спробуйте console.log (that .data [0] .cards .__ lookupGetter __ ("E")); Якщо THAT не працює, просто посилання на сторінку: D
додано Автор Esailija, джерело
Як ви створюєте об'єкт, звідки це відбувається? Ви виділили його на чистій сторінці?
додано Автор Esailija, джерело
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram