Unten sehen Sie die Ausgabe dieser beiden Protokolle. Das erste zeigt deutlich das vollständige Objekt mit der Eigenschaft, auf die ich zugreifen möchte, aber in der nächsten Codezeile kann ich nicht darauf zugreifen config.col_id_3
(siehe "undefiniert" im Screenshot?). Kann jemand das erklären? Ich kann Zugang zu jeder anderen Immobilie bekommen, außer field_id_4
auch.
console.log(config);
console.log(config.col_id_3);
Dies ist, was diese Zeilen in der Konsole drucken
javascript
console.log
Brian Litzinger
quelle
quelle
console.log(JSON.stringify(config));
teilen Sie die o / pJSON.parse(obj)
Antworten:
Die Ausgabe von
console.log(anObject)
ist irreführend; Der Status des angezeigten Objekts wird nur aufgelöst, wenn Sie das>
in der Konsole erweitern. Es ist nicht der Zustand des Objekts, wenn Sieconsole.log
das Objekt haben.Versuchen Sie es stattdessen
console.log(Object.keys(config))
oder sogarconsole.log(JSON.stringify(config))
und Sie sehen die Schlüssel oder den Status des Objekts zum Zeitpunkt Ihres Aufrufsconsole.log
.Sie werden (normalerweise) feststellen, dass die Schlüssel nach Ihrem
console.log
Anruf hinzugefügt werden .quelle
>
Unterscheidet sich das Verhalten der Schaltfläche zur Verdeutlichung davon, ob ein Array oder ein Objekt erweitert wird?Ich hatte gerade dieses Problem mit einem Dokument, das mit Mongoose aus MongoDB geladen wurde .
Bei der Ausführung
console.log()
für das gesamte Objekt werden alle Dokumentfelder (wie in der Datenbank gespeichert) angezeigt. Einige einzelne Immobilien-Accessoren würden jedoch zurückkehrenundefined
, wenn andere (einschließlich_id
) gut funktionierten.Es stellte sich heraus , dass Eigenschaftenaccessoren nur für diese Felder arbeitet in meiner angegebenen
mongoose.Schema(...)
Definition, währendconsole.log()
undJSON.stringify()
gibt alle Felder in der db gespeichert.Lösung (wenn Sie Mongoose verwenden) : Stellen Sie sicher, dass alle Ihre Datenbankfelder in definiert sind
mongoose.Schema(...)
.quelle
JSON.stringify()
(und Knotenconsole.log()
) ihr Verhalten ändern, wenn das angegebene Objekt eine.toJSON()
Funktion hat. Die Ausgabe, die Sie sehen, gibt.toJSON()
zurück und nicht das ursprüngliche Objekt. Mit Mongoose erhalten Sie Modellobjekte mit einem.toJSON()
, das das zugrunde liegende Datenbankobjekt angibt. Das Modellobjekt verfügt nur über Zugriffsmethoden für Felder, die Sie im Schema definieren. Anschließend werden jedoch alle Datenbankfelder angezeigt, wenn Sie es protokollieren, da das zugrunde liegende Objekt tatsächlich von zurückgegeben wird.toJSON()
.Überprüfen Sie, ob sich im Objekt ein Array von Objekten befindet. Ich hatte ein ähnliches Problem mit einem JSON:
Ich habe versucht, über 'Kategorie' auf den Schlüssel 'Name' zuzugreifen, und habe den undefinierten Fehler erhalten, weil ich Folgendes verwendet habe:
Dann wurde mir klar, dass es eckige Klammern hat, was bedeutet, dass es ein Array von Objekten innerhalb des Kategorieschlüssels enthält, da es mehr als ein Kategorieobjekt haben kann. Um den 'Name'-Schlüssel zu erhalten, habe ich Folgendes verwendet:
Und das macht den Trick.
Vielleicht ist es zu spät für diese Antwort, aber ich hoffe, dass jemand mit dem gleichen Problem dies findet wie ich, bevor er die Lösung gefunden hat :)
quelle
Ich hatte das gleiche Problem. Die Lösung für mich bestand darin, die stringifizierte Ausgabe als Eingabe für das Parsen des JSON zu verwenden. das hat bei mir funktioniert. Ich hoffe, es ist nützlich für Sie
quelle
Die Eigenschaft, auf die Sie zugreifen möchten, ist möglicherweise noch nicht vorhanden. Console.log funktioniert, weil es nach einer kleinen Verzögerung ausgeführt wird, aber das ist für den Rest Ihres Codes nicht der Fall. Versuche dies:
quelle
In meinem Fall habe ich ein Objekt an ein Versprechen übergeben, innerhalb des Versprechens habe ich dem Objekt weitere Schlüssel / Werte hinzugefügt, und als es fertig war, hat das Versprechen das Objekt zurückgegeben.
Ein kleiner Blick von meiner Seite, das Versprechen war jedoch, das Objekt zurückzugeben, bevor es vollständig fertig war ... daher versuchte der Rest meines Codes, das aktualisierte Objekt zu verarbeiten, und die Daten waren noch nicht da. Aber wie oben in der Konsole sah ich das Objekt vollständig aktualisiert, konnte aber nicht auf die Schlüssel zugreifen - sie kamen undefiniert zurück. Bis ich das gesehen habe:
Das [i] ist ein kleines Symbol, als ich darüber schwebte, hieß es
Object value at left was snapshotted when logged, value below was evaluated just now
. Dann kam mir der Gedanke, dass mein Objekt bewertet wurde, bevor das Versprechen es vollständig aktualisiert hatte.quelle
Ich hatte heute mit diesem Problem zu kämpfen und dachte, ich werde eine Antwort mit meiner Lösung hinterlassen.
Ich habe ein Datenobjekt über Ajax abgerufen, ungefähr so:
{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
Angenommen, dieses Objekt befindet sich in einer Variablen namens data. Wann immer ich
data.i18n
mich bezog, bekam ichundefined
.console.log(data)
zeigte das Objekt wie erwartetconsole.log(Object.keys(data))
sagte["constants","i18n"]
wie erwartetNichts hat geholfen ... Dann habe ich auf der Serverseite die Daten in das PHP-Protokoll geschrieben und es hat Folgendes enthüllt:
{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}
Das "i" im Indexschlüssel war eigentlich ein u0456 (kyrillisches i). Dies war in meinem PHP-Editor oder im Browser-Konsolenprotokoll nicht sichtbar. Nur das PHP-Protokoll enthüllte dies ... Das war eine schwierige Frage ...
quelle
Meine Daten waren nur JSON-Datenzeichenfolgen. (Diese Variable wurde in der Sitzung als JSON-Zeichenfolge gespeichert.)
-> gibt nur die Darstellung dieser Zeichenfolge zurück und es gibt keine Möglichkeit, einen Unterschied zu machen, ob es sich um eine Zeichenfolge oder ein Objekt handelt.
Damit es funktioniert, musste ich es nur wieder in ein reales Objekt konvertieren:
quelle
2018 warnt uns Mozilla hier in den Mozilla Docs !
Ich zitiere "Logging Objects" :
quelle
Dies könnte jemandem helfen, da ich ein ähnliches Problem hatte, bei dem JSON.parse () ein Objekt zurückgab, das ich auf console.log () drucken konnte, aber nicht auf die spezifischen Felder zugreifen konnte und keine der oben genannten Lösungen funktionierte mir. Wie bei der Kombination von JSON.parse () mit JSON.stringify ().
Am Ende löste ich das Problem mit einem anderen Parser, der von ExtJs Ext.decode () bereitgestellt wurde.
quelle
In meinem Fall ist es einfach so, dass ich die Daten im Format eines modellähnlichen
myMethod(data:MyModelClass)
Objekts erhalte, bis das empfangene Objekt vom Typ string war. Welches ist y in console.log (Daten) Ich bekomme den Inhalt. Die Lösung besteht darin, nur den JSON zu analysieren (in meinem Fall).Gedanken können nützlich sein.
quelle
Ich bin gerade auf dieses Problem bei Objekten gestoßen, die von csv-parser aus einer CSV-Datei generiert wurden, die von MS Excel generiert wurde. Ich konnte auf alle Eigenschaften mit Ausnahme der ersten Eigenschaft zugreifen - aber es würde in Ordnung sein, wenn ich das gesamte Objekt mit console.log schreiben würde.
Es stellte sich heraus, dass das UTF-8-CSV-Format am Anfang 3 Bytes (ef bb bf) einfügt, die einem unsichtbaren Zeichen entsprechen - die vom csv-Parser als Teil des ersten Eigenschaftskopfs aufgenommen wurden. Die Lösung bestand darin, die CSV mit der Nicht-UTF-Option neu zu generieren, wodurch das unsichtbare Zeichen beseitigt wurde.
quelle
Ich hatte ein ähnliches Problem, hoffe, die folgende Lösung hilft jemandem.
Sie können verwenden
setTimeout
Funktion verwenden, wie einige Leute hier vorschlagen, aber Sie wissen nie, wie lange Ihr Browser benötigt, um Ihr Objekt zu definieren.Aus diesem Grund würde ich vorschlagen,
setInterval
stattdessen die Funktion zu verwenden. Es wird warten, bis Ihr Objektconfig.col_id_3
definiert ist, und dann Ihren nächsten Codeteil auslösen, der Ihre spezifischen Objekteigenschaften erfordert.quelle
Wenn Sie
TYPESCRIPT
und / oder verwendenANGULAR
, könnte es dies sein!.then((res: any) => res.json())
Wenn ich den Antworttyp auf ein für mich behobenes Problem setze, konnte ich nicht auf Eigenschaften der Antwort zugreifen, bis ich res: any festgelegt habe
siehe diese Frage Die Eigenschaft '_body' ist für den Typ 'Response' nicht vorhanden.
quelle
Ich hatte das gleiche Problem und keine der oben genannten Lösungen funktionierte für mich und es fühlte sich danach wie eine Vermutung an. Das Umschließen meines Codes, der das Objekt in eine
setTimeout
Funktion erstellt, hat mir jedoch geholfen.quelle
Ich hatte ein ähnliches Problem oder war vielleicht nur verwandt.
In meinem Fall habe ich auf Eigenschaften eines Objekts zugegriffen, aber eines war undefiniert. Ich stellte fest, dass das Problem ein Leerzeichen im serverseitigen Code beim Erstellen des Schlüssels val des Objekts war.
Mein Ansatz war wie folgt ...
Nachdem ich den Leerraum aus dem serverseitigen Code entfernt hatte, mit dem das Objekt erstellt wurde, konnte ich nun wie folgt auf die Eigenschaft zugreifen ...
Dies ist möglicherweise nicht das Problem mit dem Fall der betreffenden Frage, war jedoch für meinen Fall und möglicherweise für einen anderen. Ich hoffe es hilft.
quelle
Ich hatte gerade das gleiche Problem mit einem Dokument, das mit Mongoose aus MongoDB geladen wurde.
Es stellte sich heraus, dass ich die Eigenschaft verwende
find()
, um nur ein Objekt zurückzugeben, also wechselte ichfind()
zufindOne()
und alles funktionierte für mich.Lösung (wenn Sie Mongoose verwenden): Stellen Sie sicher, dass Sie nur ein Objekt zurückgeben, damit Sie es analysieren können. Andernfalls
object.id
wird es als Array behandelt, sodass Sie darauf zugreifen müssenobject[0].id
.quelle
Für mich stellte sich heraus, dass es sich um ein Mungo-Problem handelte.
Ich habe Objekte durchlaufen, die ich aus einer Mongo-Abfrage erhalten habe. Ich musste nur entfernen:
Und ersetzen Sie es durch:
quelle
Ich hatte ein Problem wie dieses und fand, dass die Lösung mit Underscore.js zu tun hatte. Meine anfängliche Protokollierung ergab keinen Sinn:
Ich fand die Lösung, indem ich auch die Schlüssel des Objekts betrachtete:
Dies führte mich zu der Erkenntnis, dass
obj
es sich tatsächlich um einen Underscore.js-Wrapper um ein Objekt handelte, und das anfängliche Debugging hat mich angelogen.quelle
Ich hatte ein ähnliches Problem (bei der Entwicklung für SugarCRM), bei dem ich anfange:
Das Problem war
fetch()
, es war ein asynchroner Aufruf, also musste ich meinen Code umschreiben in:quelle
Nur für den Fall, dass dies für jemanden hilfreich ist, hatte ich ein ähnliches Problem, und das liegt daran, dass jemand in dem Objekt, mit dem ich gearbeitet habe, eine Überschreibung für .toJSON erstellt hat. Das Objekt war also so etwas wie:
Aber .toJSON () war:
Als ich JSON.stringify (myObject) aufrief, gab es "{" bar ":" Hello "," baz ":" World "}" zurück. Object.keys (myObject) enthüllte jedoch das "foo".
quelle
toJson()
Dies ist der Punkt, den hier niemand erwähnt hat. Ich weiß nicht, warum diese Antwort abgelehnt wurde, da dies eine Möglichkeit ist, ein Objekt zu erstellen, das einen anderen Wert als die JSON- oder Konsolendarstellung hat. Ich wusste nicht, dass es existiert, bis ich es in einer anderen Antwort aufgedeckt habe, und ich denke, diese Antwort sollte positiv bewertet werden, da es ein Punkt ist, den man bei solchen Problemen berücksichtigen sollte.Ich hatte heute das gleiche Problem. In meinem Fall waren die Schlüssel verschachtelt, dh key1.key2. Ich habe die Schlüssel mit split () geteilt und dann die eckige Klammer-Notation verwendet, die für mich funktioniert hat.
Ich teilte die Schlüssel und benutzte sie so, Daten [Schlüssel1] [Schlüssel2], die die Arbeit für mich erledigten.
quelle
Ich hatte heute das gleiche Problem. Problem wurde durch uglify-js verursacht. Nachdem ich das gleiche nicht hässliche Code-Problem ausgeführt hatte, wurde es gelöst. Entfernen von
von uglify-js war genug, um uglifizierten Code zu haben.
Möglicherweise empfiehlt es sich, ein Präfix für Eigenschaften zu verwenden, die mit der Regex-Regel für uglify-js entstellt werden müssen.
Hier ist die Quelle:
und so wurde es hässlich gemacht:
quelle
Keiner der JSON-Stringify / Parse hat für mich funktioniert.
Ich wollte den Wert von
formValues.myKey
und was der Trick tat, war ein setTimeout 0 wie im folgenden Beispiel. Ich hoffe es hilft.quelle
Ich bin gerade auch auf dieses Problem gestoßen, und kurz gesagt, meine API hat einen Zeichenfolgentyp und nicht JSON zurückgegeben. Es sah also genauso aus, als Sie es in das Protokoll druckten, aber wenn ich versuchte, auf die Eigenschaften zuzugreifen, gab es einen undefinierten Fehler.
API-Code:
vorher war ich gerade zurückgekehrt:
quelle