2011-10-27 13 views
10

Weź pod uwagę poniższy kod. Pierwszy console.log prawidłowo rejestruje obraz, a jego właściwości widać na poniższym obrazku. Jednak, gdy próbuję zalogować się do jego właściwości do konsoli, otrzymuję undefined!Dlaczego ta właściwość obiektu jest niezdefiniowana?

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 

Wynik w konsoli:

enter image description here

Każdy pomysł, co tu się dzieje? Właściwość xml wewnątrz that.data[0] powinna również posiadać właściwości wewnątrz niej - nazwane tak samo, jak właściwości w cards.

FWIW, Dostaję to samo w Firebug (powyższy obraz konsoli to Chrome).

+1

Nie mogę ci pomóc, jeśli nie możemy powtórzyć tego zachowania. Czy możesz podać JSON? –

+2

Czy możesz przekazać wynik JSON.stringify (that)? – FreeCandies

+0

'JSON.stringify (that)' nie wydaje się nic robić, tylko doprowadzić skrypt do całkowitego zatrzymania.Nie wyrzuca błędu ani niczego innego, ale nic nie działa po wywołaniu 'JSON.stringify (that)'. Zaktualizowałem swoje pytanie, aby pokazać wyniki 'JSON.stringify (that.data [0] .cards)', które pokazują, że jest to pusty obiekt '{}'. – maxedison

Odpowiedz

11

mam rozwiązać ten problem. Zasadniczo przedmiot, o którym mowa (that.data[0].cards) ma swoje właściwości utworzone przez funkcję a(), która działa po przetworzeniu wszystkich żądań AJAX dotyczących niezbędnych plików XML. Pozwalam, aby żądania były uruchamiane asynchronicznie, za pomocą licznika w celu określenia w funkcji wywołania zwrotnego success, jeśli należy jeszcze wywołać a().

Po uruchomieniu a() funkcja b() ma wykonywać operacje na that.data[i].cards. Jednak przed a() zadzwoniono pod numer a(), ponieważ polegało ono na asynchronicznych żądaniach. Rozwiązaniem było po prostu wywołanie a() połączenia b().

To okazało się całkiem prostym błędem z mojej strony. To, co sprawiło, że było to mylące, to fakt, że zapisanie na konsolę that.data[0].cards pokazało mi, że faktycznie obiekt cards został już zbudowany, podczas gdy w rzeczywistości jeszcze go nie było. Tak więc konsola dostarczała mi niepoprawnych - lub przynajmniej niejasnych - informacji.

Dzięki za pomoc wszystkich zeszłej nocy! Rozrzut dookoła :)

+0

Kolejna zagadka rozwiązana :) – Esailija

+0

Wpadłem dziś na ten sam problem. Dzięki. –

7

myślę klucze przedmiot posiada znaki niedrukowalne, taki może być powielana tak:

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)]) 

//[] 

Edycja: można sprawdzić, czy jest to przypadek dla kluczy obiektowych:

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 : Ponieważ nie możesz tego zrobić, wymyśliłem inny sposób sprawdzenia, czy istnieją niedrukowalne znaki:

Skopiuj łańcuch kluczowy w ten sposób: (przejdź całą drogę, ile możesz na bo th kończy więc wybrać jakieś niewidoczne znaki)

Następnie zrzucić swoją Schowek tak (Upewnij się, że używasz cudzysłowów):

+0

Wydaje się, że daje ten sam wynik. Zrobiłem: 'console.log (that.data [0] .cards ['E' + String.fromCharCode (15)]);' – maxedison

+0

To dlatego, że obiekt może mieć inną niewidoczną postać niż 'String.fromCharCode (15)' może to być 3, 24 lub 22 i tak dalej :) – Esailija

+0

@macedison: I z powodu @ Esailija należy skopiować/wkleić dokładny wynik 'JSON.stringify (that.data [0])', aby mógł być zbadane – pimvdb

Powiązane problemy