Poniżej widać dane wyjściowe z tych dwóch dzienników. Pierwszy wyraźnie pokazuje pełny obiekt z właściwością, do której próbuję uzyskać dostęp, ale w następnym wierszu kodu nie mogę uzyskać do niego dostępu config.col_id_3
(patrz „niezdefiniowany” na zrzucie ekranu?). Czy ktoś może to wyjaśnić? Mogę uzyskać dostęp do każdej innej nieruchomości oprócz field_id_4
.
console.log(config);
console.log(config.col_id_3);
To właśnie te linie drukują w Konsoli
javascript
console.log
Brian Litzinger
źródło
źródło
console.log(JSON.stringify(config));
podzielić się o / pJSON.parse(obj)
Odpowiedzi:
Wyniki
console.log(anObject)
są mylące; stan wyświetlanego obiektu zostanie rozwiązany dopiero po rozwinięciu>
konsoli. To nie jest stan obiektu, gdy jesteśconsole.log
obiektem.Zamiast tego spróbuj
console.log(Object.keys(config))
, a nawetconsole.log(JSON.stringify(config))
zobaczysz klucze lub stan obiektu w momencie, w którym zadzwoniłeśconsole.log
.Zazwyczaj zauważysz, że klucze są dodawane po zakończeniu
console.log
połączenia.źródło
>
przycisku różni się w zależności od tego, czy tablica jest rozwijana, czy obiekt?Właśnie miałem ten problem z dokumentem załadowanym z MongoDB przy użyciu Mongoose .
Podczas działania
console.log()
na całym obiekcie pojawią się wszystkie pola dokumentu (zapisane w bazie danych). Jednak niektóre osoby przystępujące do nieruchomości wrócąundefined
, gdy inne (w tym_id
) działali dobrze.Okazało się, że akcesory własności działają tylko dla tych pól określonych w mojej
mongoose.Schema(...)
definicji, natomiastconsole.log()
iJSON.stringify()
zwrotów wszystkie pola przechowywane w db.Rozwiązanie (jeśli używasz Mongoose) : upewnij się, że wszystkie pola db są zdefiniowane w
mongoose.Schema(...)
.źródło
JSON.stringify()
(i Węzłyconsole.log()
) zmieniają swoje zachowanie, jeśli dany obiekt ma.toJSON()
funkcję. Wyświetlane dane wyjściowe.toJSON()
zwracają, a nie oryginalny obiekt. Mongoose daje obiekty modelowe,.toJSON()
które dają bazowy obiekt db. Obiekt modelu ma tylko akcesoria dla pól zdefiniowanych w schemacie, ale wtedy wszystkie pola db pojawiają się po zalogowaniu, ponieważ faktycznie widzisz zwracany obiekt.toJSON()
.Sprawdź, czy wewnątrz obiektu znajduje się tablica obiektów. Miałem podobny problem z JSON:
Próbowałem uzyskać dostęp do klucza „nazwa” z „kategorii” i otrzymałem niezdefiniowany błąd, ponieważ korzystałem z:
Potem zdałem sobie sprawę, że ma nawiasy kwadratowe, co oznacza, że ma tablicę obiektów wewnątrz klucza kategorii, ponieważ może mieć więcej niż jeden obiekt kategorii. Tak więc, aby uzyskać klucz „nazwa” użyłem tego:
I to załatwia sprawę.
Być może jest już za późno na tę odpowiedź, ale mam nadzieję, że ktoś z tym samym problemem znajdzie to, co przedtem, zanim znalazł rozwiązanie :)
źródło
Miałem ten sam problem. Rozwiązaniem dla mnie było użycie wyjściowego łańcucha jako danych wejściowych do parsowania JSON. to działało dla mnie. mam nadzieję, że ci się przyda
źródło
Właściwość, do której próbujesz uzyskać dostęp, może jeszcze nie istnieć. Console.log działa, ponieważ uruchamia się z niewielkim opóźnieniem, ale nie dotyczy to reszty kodu. Spróbuj tego:
źródło
W moim przypadku przekazałem obiekt do obietnicy, w ramach obietnicy dodawałem więcej klucza / wartości do obiektu, a kiedy to zostało zrobione, obietnica zwróciła obiekt.
Jednak z mojego drobnego spojrzenia, obietnica zwróciła obiekt, zanim został w pełni ukończony ... tak więc reszta mojego kodu próbowała przetworzyć zaktualizowany obiekt, a danych jeszcze nie było. Ale tak jak powyżej, w konsoli widziałem obiekt w pełni zaktualizowany, ale nie mogłem uzyskać dostępu do klawiszy - wracały niezdefiniowane. Dopóki tego nie zobaczyłem:
[I] jest trochę ikona, kiedy unosił się nad nim powiedziane
Object value at left was snapshotted when logged, value below was evaluated just now
. Właśnie wtedy przyszło mi do głowy, że mój obiekt jest oceniany, zanim obietnica go w pełni zaktualizuje.źródło
Dzisiaj zmagałem się z tym problemem i pomyślałem, że zostawię odpowiedź z moim rozwiązaniem.
Pobierałem obiekt danych przez ajax, coś takiego:
{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
Powiedzmy, że ten obiekt znajduje się w zmiennej o nazwie dane. Ilekroć się odnosiłam
data.i18n
, dostałamundefined
.console.log(data)
pokazał obiekt zgodnie z oczekiwaniamiconsole.log(Object.keys(data))
powiedział["constants","i18n"]
zgodnie z oczekiwaniamiNic nie pomogło ... Potem po stronie serwera zapisałem dane do dziennika php i ujawniło to:
{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}
„I” w kluczu indeksu było w rzeczywistości u0456 (cyrylica i). Nie było to widoczne w moim edytorze php ani w dzienniku konsoli przeglądarki. Tylko dziennik php to ujawnił ... To był trudny ...
źródło
Moje dane były tylko ciągiem danych JSON. (Ta zmienna została zapisana jako ciąg json w sesji).
-> zwraca tylko reprezentację tego ciągu i nie ma sposobu, aby zrobić różnicę, czy jest to ciąg, czy obiekt.
Aby więc działało, wystarczyło przekonwertować go z powrotem na prawdziwy obiekt:
źródło
W 2018 roku Mozilla ostrzega nas tutaj w Dokumentach Mozilla !
Cytuję „Rejestrowanie obiektów” :
źródło
Może to komuś pomóc, ponieważ miałem podobny problem, w którym JSON.parse () zwracał obiekt, który mogłem wydrukować na console.log (), ale nie mogłem uzyskać dostępu do określonych pól i żadne z powyższych rozwiązań nie działało mnie. Jak użycie kombinacji JSON.parse () z JSON.stringify ().
Skończyło się na rozwiązaniu problemu przy użyciu innego parsera dostarczonego przez ExtJs Ext.decode ();
źródło
W moim przypadku zdarza się tak, że mimo iż otrzymuję dane w formacie
myMethod(data:MyModelClass)
modelopodobnym, dopóki otrzymany obiekt nie ma typu string. Który jest w pliku console.log (dane) otrzymuję treść. Rozwiązaniem jest po prostu parsowanie JSON (w moim przypadku)Myśl może być przydatna.
źródło
Właśnie napotkałem ten problem z obiektami wygenerowanymi przez csv-parser z pliku CSV wygenerowanego przez MS Excel. Byłem w stanie uzyskać dostęp do wszystkich właściwości oprócz pierwszej właściwości - ale byłoby dobrze, gdybym napisał cały obiekt za pomocą console.log.
Okazało się, że format UTF-8 CSV wstawia na początku 3 bajty (ef bb bf) odpowiadające niewidocznemu znakowi - które zostały włączone jako część pierwszego nagłówka właściwości przez csv-parser. Rozwiązaniem było ponowne wygenerowanie pliku CSV przy użyciu opcji innej niż UTF, co wyeliminowało niewidoczny charakter.
źródło
Mam podobny problem, mam nadzieję, że poniższe rozwiązanie komuś pomoże.
Możesz użyć
setTimeout
funkcji, jak sugerują tutaj niektórzy faceci, ale nigdy nie wiesz, jak dokładnie Twoja przeglądarka musi zdefiniować obiekt.Poza tym sugerowałbym użycie
setInterval
funkcji zamiast tego. Poczeka, aż obiektconfig.col_id_3
zostanie zdefiniowany, a następnie uruchomi następną część kodu, która wymaga określonych właściwości obiektu.źródło
jeśli używasz
TYPESCRIPT
i / lubANGULAR
może to być to!.then((res: any) => res.json())
ustawiając typ odpowiedzi na jakąkolwiek naprawioną ten problem, nie mogłem uzyskać dostępu do właściwości odpowiedzi, dopóki nie ustawię res: any
zobacz to pytanie Właściwość „_body” nie istnieje dla typu „Odpowiedź”
źródło
Miałem ten sam problem i żadne z powyższych rozwiązań nie zadziałało i wydawało mi się, że potem zgaduję. Jednak owinięcie mojego kodu, który tworzy obiekt w
setTimeout
funkcji, załatwiło sprawę.źródło
Miałem podobny problem, a może po prostu spokrewniony.
W moim przypadku miałem dostęp do właściwości obiektu, ale jeden był niezdefiniowany. Odkryłem, że problemem jest spacja w kodzie po stronie serwera podczas tworzenia klucza, val obiektu.
Moje podejście było następujące ...
Po usunięciu białych znaków z kodu po stronie serwera tworzącego obiekt, mogłem teraz uzyskać dostęp do właściwości jak poniżej ...
To może nie być problem w przypadku pytania przedmiotowego, ale dotyczyło mojego przypadku i może być tak w przypadku innego. Mam nadzieję, że to pomoże.
źródło
Właśnie miałem ten sam problem z dokumentem załadowanym z MongoDB przy użyciu Mongoose.
Okazało się, że używam właściwość
find()
, aby powrócić tylko jeden przedmiot, więc zmieniłafind()
sięfindOne()
i wszystko działało na mnie.Rozwiązanie (jeśli używasz Mongoose): Upewnij się, że zwrócisz tylko jeden obiekt, abyś mógł go przeanalizować
object.id
lub będzie traktowany jako tablica, więc musisz uzyskać do niego dostęp w ten sposóbobject[0].id
.źródło
Dla mnie okazało się, że jest to problem związany z mangustą.
Zapętlałem obiekty, które otrzymałem z zapytania Mongo. Musiałem tylko usunąć:
I zamień na:
źródło
Miałem taki problem i znalazłem rozwiązanie związane z Underscore.js. Moje początkowe logowanie nie miało sensu:
Znalazłem rozwiązanie, patrząc również na klucze obiektu:
Doprowadziło mnie to do wniosku, że
obj
tak naprawdę obiekt był opakowaniem Underscore.js wokół obiektu, a początkowe debugowanie mnie okłamało.źródło
Miałem podobny problem (podczas programowania dla SugarCRM), gdzie zaczynam od:
Problem polegał na
fetch()
wywołaniu asynchronicznym, więc musiałem przepisać kod na:źródło
Na wypadek, gdyby było to komuś pomocne, miałem podobny problem, a to dlatego, że ktoś utworzył przesłonięcie dla .toJSON w obiekcie, z którym pracowałem. Obiekt był więc podobny do:
Ale .toJSON () był:
Kiedy zadzwoniłem do JSON.stringify (myObject), zwróciło „{” bar ”:„ Hello ”,„ baz ”:„ World ”}”. Jednak Object.keys (myObject) ujawnił „foo”.
źródło
toJson()
o tym nie wspomina nikt. Nie wiem, dlaczego ta odpowiedź została odrzucona, ponieważ jest to sposób na utworzenie obiektu, który ma inną wartość niż reprezentacja json lub konsoli. Nie wiedziałem, że istnieje, dopóki nie odkryłem go w innej odpowiedzi, i uważam, że odpowiedź ta powinna być oceniona pozytywnie, ponieważ warto rozważyć tego rodzaju problemy.Dzisiaj stanąłem przed tym samym problemem. W moim przypadku klucze zostały zagnieżdżone, tzn. Key1.key2. Rozdzieliłem klucze za pomocą split (), a następnie użyłem notacji w nawiasach kwadratowych, która zadziałała dla mnie.
Rozdzieliłem klucze i użyłem tego w ten sposób, dane [key1] [key2], które wykonały dla mnie zadanie.
źródło
Miałem dzisiaj ten sam problem. Problem został spowodowany przez uglify-js. Po wykonaniu tego samego nieglikowanego kodu problem został rozwiązany. Usuwanie
z uglify-js wystarczyło, by mieć działający kod nieoczyszczony.
Być może najlepszą praktyką jest użycie jakiegoś prefiksu dla właściwości, które muszą być zniekształcone za pomocą reguły wyrażenia regularnego dla uglify-js.
Oto źródło:
a oto, w jaki sposób został zglikowany:
źródło
Żaden z JSON stringify / pars nie działał dla mnie.
Chciałem wartość
formValues.myKey
i to, co zrobiło lewę, to setTimeout 0, jak w poniższym przykładzie. Mam nadzieję, że to pomoże.źródło
Właśnie spotkałem ten problem i krótko mówiąc mój interfejs API zwrócił typ ciągu, a nie JSON. Wyglądało to dokładnie tak samo, gdy drukowałeś go w dzienniku, jednak ilekroć próbowałem uzyskać dostęp do właściwości, dawał mi nieokreślony błąd.
Kod API:
poprzednio właśnie wracałem:
źródło
Miałem podobny problem dzisiaj w React. W końcu zdałem sobie sprawę, że przyczyną problemu był stan, który nie został jeszcze ustawiony. Dzwoniłem
user.user.name
i chociaż pojawiał się w konsoli, nie mogłem uzyskać dostępu do niego w moim komponencie, dopóki nie dołączyłem sprawdzania, czyuser.user
został ustawiony, a następnie dzwoniłemuser.user.name
.źródło