Das verblüfft mich. Ich weiß nicht, wie ich das sonst erklären soll, aber so sieht mein Debug-Code aus. Darunter sehen Sie die Ausgabe dieser beiden Protokolle. Das erste zeigt deutlich das vollständige JavaScript-Objekt mit der Eigenschaft, auf die ich zugreifen möchte, aber schon auf den nächsten Zeilencode kann ich nicht mit config.col_id_3 zugreifen (siehe "undefined" im Screenshot?). Kann das jemand erklären? Ich kann auch auf jede andere Eigenschaft zugreifen, außer auf field_id_4.
console.log(config);
console.log(config.col_id_3);
Dies ist, was diese console.log () in Console drucken
Die Ausgabe von console.log(anObject)
ist irreführend. Der Status des angezeigten Objekts wird nur aufgelöst, wenn Sie >
in der Konsole erweitern. Es ist nicht der Zustand des Objekts, wenn Sie das Objekt console.log
d eingeben.
Versuchen Sie stattdessen console.log(Object.keys(config))
oder sogar console.log(JSON.stringify(config))
. Sie sehen die Schlüssel oder den Status des Objekts zu dem Zeitpunkt, zu dem Sie console.log
aufgerufen haben.
Sie werden (normalerweise) feststellen, dass die Schlüssel nach Ihrem Aufruf console.log
hinzugefügt werden.
Ich hatte gerade dieses Problem mit einem Dokument, das von MongoDB mit Mongoose geladen wurde.
Wenn Sie console.log()
für das gesamte Objekt ausführen, werden alle Dokumentfelder (wie in der Datenbank gespeichert) angezeigt. Einige Eigenschaftszugriffe geben jedoch undefined
zurück, wenn andere (einschließlich _id
) einwandfrei funktionieren.
Es stellte sich heraus, dass Eigenschaftszugriffsfunktionen nur für die in meiner mongoose.Schema(...)
-Definition angegebenen Felder funktionieren, während console.log()
und JSON.stringify()
alle in der Datenbank gespeicherten Felder zurückgibt.
Solution (wenn Sie Mongoose verwenden): Stellen Sie sicher, dass alle Ihre Datenbankfelder in mongoose.Schema(...)
definiert sind.
Prüfen Sie, ob sich innerhalb des Objekts ein Array von Objekten befindet. Ich hatte ein ähnliches Problem mit einem JSON:
"terms": {
"category": [
{
"ID": 4,
"name": "Cirugia",
"slug": "cirugia",
"description": "",
"taxonomy": "category",
"parent": null,
"count": 68,
"link": "http://distritocuatro.mx/enarm/category/cirugia/"
}
]
}
Ich habe versucht, auf den 'Namen'-Schlüssel von' Kategorie 'zuzugreifen, und ich habe die Fehlermeldung undefined erhalten, weil ich Folgendes verwendet habe:
var_name = obj_array.terms.category.name
Dann wurde mir klar, dass es eckige Klammern hat, das heißt, es hat ein Array von Objekten innerhalb des Kategorieschlüssels, da es mehr als ein Kategorieobjekt haben kann. Um den 'name'-Schlüssel zu erhalten, habe ich folgendes verwendet:
var_name = obj_array.terms.category[0].name
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 ich die Lösung gefunden habe :)
Die Eigenschaft, auf die Sie zugreifen möchten, ist möglicherweise noch nicht vorhanden. Console.log funktioniert, da es nach einer kurzen Verzögerung ausgeführt wird. Dies gilt jedoch nicht für den Rest Ihres Codes. Versuche dies:
var a = config.col_id_3; //undefined
setTimeout(function()
{
var a = config.col_id_3; //voila!
}, 100);
Ich hatte das gleiche Problem. Die Lösung für mich bestand darin, die stringifizierte Ausgabe als Eingabe für die Analyse des JSON zu verwenden. das hat für mich funktioniert. Ich hoffe es ist nützlich für Sie
var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);
In meinem Fall habe ich ein Objekt an ein Versprechen übergeben, und innerhalb des Versprechens habe ich dem Objekt mehr Schlüssel/Werte hinzugefügt, und als es fertig war, gab das Versprechen das Objekt zurück.
Ein leichter Blick von meiner Seite, das Versprechen bestand jedoch darin, das Objekt zurückzugeben, bevor es vollständig fertiggestellt war. Daher versuchte der Rest meines Codes, das aktualisierte Objekt zu verarbeiten, und die Daten waren noch nicht vorhanden. 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 sah:
console.log(obj) ;
console.log(obj.newKey1) ;
// returned in console
> Object { origKey1: "blah", origKey2: "blah blah"} [i]
origKey1: "blah"
origKey2: "blah blah"
newKey1: "this info"
newKey2: "that info"
newKey3: " more info"
> *undefined*
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
. Damals fiel mir ein, dass mein Objekt bewertet wurde, bevor das Versprechen es vollständig aktualisiert hatte.
Ich habe heute mit diesem Thema zu kämpfen und dachte, ich würde eine Antwort mit meiner Lösung hinterlassen.
Ich habe ein Datenobjekt über Ajax abgerufen, etwa so: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
Nehmen wir an, dieses Objekt befindet sich in einer Variablen namens Daten. Wann immer ich auf data.i18n
verwies, bekam ich undefined
.
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-Log geschrieben und es hat folgendes ergeben:
{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}
Das "i" im Indexschlüssel war tatsächlich ein u0456 (kyrillisches i). Dies war in meinem PHP-Editor oder im Protokoll der Browserkonsole nicht sichtbar. Nur das PHP-Log enthüllte dies ... Das war ein kniffliges ...
Meine Daten waren nur Json-Datenstring. (Diese Variable wurde in der Sitzung als Json-String gespeichert.)
console.log(json_string_object)
-> gibt nur die Darstellung dieses Strings zurück und es gibt keine Möglichkeit, einen Unterschied zu machen, ob es sich um einen String oder ein Objekt handelt.
Damit es funktioniert, musste ich es nur in ein reales Objekt zurückverwandeln:
object = JSON.parse(json_string_object);
Ich poste hier nicht viel wegen der Irritation, dass ich nicht genug Posts habe, um zu kommentieren, aber der Typ, der das hier unten gepostet hatte, war richtig. Der Ajax-Aufruf war nicht abgeschlossen, als Sie auf das Objekt zugegriffen haben. Ich würde sogar noch weiter gehen und 500 für das Timeout verwenden, nur um sicher zu sein.
var a = config.col_id_3; //undefined
setTimeout(function()
{
var a = config.col_id_3; //voila!
}, 500);
Dies könnte jemandem helfen, da ich ein ähnliches Problem hatte, bei dem JSON.parse () ein Objekt zurückgab, das ich auf der Konsole.log () drucken konnte, aber ich konnte die spezifischen Felder nicht abrufen und keine der oben genannten Lösungen funktionierte mir. Zum Beispiel die Kombination von JSON.parse () mit JSON.stringify ().
var jsonObj = JSON.parse(JSON.stringify(responseText))
// where responseText is a JSON String returned by the server.
console.log(jsonObj) ///Was printing the object correctly
console.log(jsonObj.Body) /// Was printing Undefined
Am Ende habe ich das Problem gelöst, indem ich einen anderen Parser von ExtJs Ext.decode () verwendet habe.
var jsonObj = Ext.decode(responseText)
console.log(jsonObj.Body) //Worked...
wenn Sie TypeScript
und/oder ANGULAR
verwenden, könnte dies sein!
.then((res: any) => res.json())
festlegen des Antworttyps auf Alle , mit denen dieses Problem behoben wurde. Ich konnte auf die Eigenschaften der Antwort erst zugreifen, nachdem ich festgelegt hatte ) res: any
siehe diese Frage Eigenschaft '_body' existiert bei Typ 'Response' nicht
Ich hatte ein ähnliches Problem, ich hoffe die folgende Lösung hilft jemandem.
Sie können die Funktion "setTimeout
" verwenden, wie einige Leute hier vorschlagen, aber Sie wissen nie, wie lange Ihr Browser benötigt, um Ihr Objekt definieren zu können.
Aus diesem Grund würde ich vorschlagen, stattdessen diesetInterval
- Funktion zu verwenden. Es wird warten, bis Ihr Objekt config.col_id_3
definiert ist, und dann wird der nächste Codeteil ausgelöst, der Ihre spezifischen Objekteigenschaften erfordert.
window.addEventListener('load', function(){
var fileInterval = setInterval(function() {
if (typeof config.col_id_3 !== 'undefined') {
// do your stuff here
clearInterval(fileInterval); // clear interval
}
}, 100); // check every 100ms
});
config = JSON.parse(config);
Ich hatte dasselbe, die Daten waren ein Text und kein JSON, wie ich erwartet hatte.
Ich hatte gerade das gleiche Problem mit einem Dokument, das mit Mongoose aus MongoDB geladen wurde.
Es stellte sich heraus, dass ich die Eigenschaft find()
verwende, um nur ein Objekt zurückzugeben, also habe ich find()
in findOne()
geändert und alles hat für mich funktioniert.
Lösung (wenn Sie Mongoose verwenden): Stellen Sie sicher, dass Sie nur ein Objekt zurückgeben, damit Sie dessen object.id
Analysieren können. Andernfalls wird es als Array behandelt, sodass Sie darauf wie folgt zugreifen müssen object[0].id
.
Versuchen Sie es mit config [0] oder config [0] .col_id_3
Ich hatte auch gerade dieses Problem, ich konnte ein Objekt sehen, um es zu protokollieren, aber keinen Zugriff auf den Code. Ich habe dann versucht, eine [0] davor hinzuzufügen und mein Problem zu lösen. Ich konnte dann auf alle Eigenschaften zugreifen.
Ich hatte das gleiche Problem und keine der oben genannten Lösungen funktionierte für mich, und es fühlte sich an, als würde man die Arbeit danach erraten. Der Umbruch meines Codes, mit dem das Objekt in einer setTimeout
-Funktion erstellt wird, hat mir jedoch geholfen.
setTimeout(function() {
var myObj = xyz; //some code for creation of complex object like above
console.log(myObj); // this works
console.log(myObj.propertyName); // this works too
});
Ich hatte ein ähnliches Problem oder vielleicht nur im Zusammenhang.
Für meinen Fall habe ich auf die Eigenschaften eines Objekts zugegriffen, aber eines war nicht definiert. Das Problem war ein Leerzeichen im serverseitigen Code, während der Schlüssel val des Objekts erstellt wurde.
Mein Ansatz war wie folgt ...
Nach dem Entfernen des Leerraums aus dem serverseitigen Code, der das Objekt erstellt hat, konnte ich nun wie folgt auf die Eigenschaft zugreifen ...
Dies ist möglicherweise nicht der Fall bei der Betrefffrage, aber es war für mich der Fall und für einen anderen. Ich hoffe es hilft.
In meinem Fall ist es einfach so, dass, obwohl ich die Daten im Format eines Modells wie myMethod(data:MyModelClass)
object erhalten habe, bis das empfangene Objekt den Typ string ..__ hat content . Lösung ist nur das JSON zu analysieren (in meinem Fall)
const model:MyMOdelClass=JSON.parse(data);
Gedanken können nützlich sein.
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:
console.log(JSON.stringify(obj, null, 2));
> {
> "code": "foo"
> }
console.log(obj.code);
> undefined
Ich habe die Lösung gefunden, indem ich auch die Schlüssel des Objekts betrachtete:
console.log(JSON.stringify(Object.keys(obj)));
> ["_wrapped","_chain"]
Dies veranlasste mich zu der Erkenntnis, dass obj
tatsächlich ein Underscore.js-Wrapper um ein Objekt war und das anfängliche Debugging mich belogen hat.
Ausgezeichnete Vorschläge. Ich hatte gerade ein ähnliches Problem, also meine zwei Cents ... Eine Sache, die das Problem behoben hat, war die Zugabe von 'json: true' in meinen Anforderungsoptionen. (Das hängt natürlich von der verwendeten Bibliothek ab, die allgemeine Voraussetzung ist jedoch dieselbe - geben Sie das erwartete Inhaltsformat an.)
Ich hatte heute das gleiche Problem. Das Problem wurde durch uglify-js verursacht. Nachdem ich dasselbe nicht-verifizierte Code-Problem ausgeführt hatte, wurde dieses Problem behoben. Entfernen von
--mangle-props
von uglify-js genügte, um den Code zu bearbeiten.
Möglicherweise verwenden Sie ein Präfix für Eigenschaften, die mit der Regex-Regel für uglify-js entstellt werden müssen.
Hier ist die Quelle:
var data = JSON.parse( content);
...
this.pageIndex = parseInt(data.index);
this.pageTotal = parseInt(data.total);
this.pageLimit = parseInt(data.limit);
und hier ist es, wie es ublifiziert wurde:
var n = JSON.parse( t);
...
this._ = parseInt(n.index), this.g = parseInt(n.total), this.D = parseInt(n.C)
Ich stand heute vor demselben Problem. In meinem Fall waren die Schlüssel verschachtelt, d. H. Key1.key2 . Ich spaltete die Schlüssel mit split () auf und verwendete dann die eckige Klammernotation, die für mich funktionierte.
var data = {
key1: {
key2: "some value"
}
}
Ich habe die Schlüssel aufgeteilt und so verwendet, Daten [key1] [key2], die die Arbeit für mich erledigt haben.
Für mich stellte sich heraus, dass es sich um ein Problem der Mungos handelte.
Ich habe über Objekte geschlungen, die ich von einer Mongo-Abfrage erhalten habe. Ich musste nur entfernen:
await items = Model.find()
Und ersetze es durch:
await items = Model.find().lean()
Hervorragende Vorschläge hier. Ich werde hinzufügen, da jemand es nützlich finden kann.
Seien Sie sich des Cachings im Browser oder aus der Ferne bewusst.
Ich hatte Probleme damit, da ich online entwickle und eine einfache Strategie umsetzte.
Sobald ich die Syntax richtig verstanden habe, habe ich die zuvor vorgeschlagene Verzögerung entfernt und alles ist gut. Für mich musste ich "JSON.stringify" verwenden.
Nur für den Fall, dass dies für jemanden hilfreich ist, hatte ich ein ähnliches Problem. Dies liegt daran, dass jemand eine Überschreibung für .toJSON in dem Objekt erstellt hat, mit dem ich gearbeitet habe. Das Objekt war also so etwas wie:
{
foo: {
bar: "Hello"
baz: "World"
}
}
Aber .toJSON () war:
toJSON() {
return this.foo
}
Wenn ich also JSON.stringify (myObject) anrief, wurde "{" bar ":" Hello "," baz ":" World "}" zurückgegeben. Object.keys (myObject) enthüllte jedoch das "Foo".
Dieses Problem ist gerade bei Objekten aufgetreten, die vom 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 - sie würde jedoch in Ordnung erscheinen, wenn ich das gesamte Objekt mit console.log schreibe.
Es stellte sich heraus, dass das UTF-8-CSV-Format am Anfang 3 Byte (ef bb bf) enthält, die einem unsichtbaren Zeichen entsprechen - die vom csv-parser als Teil des ersten Eigenschaftsheaders eingefügt wurden. Die Lösung bestand darin, das CSV mit der Nicht-UTF-Option neu zu generieren, wodurch der unsichtbare Charakter beseitigt wurde.
Ich hatte ein ähnliches Problem (bei der Entwicklung für SugarCRM), wo ich mit:
var leadBean = app.data.createBean('Leads', {id: this.model.attributes.parent_id});
// This should load object with attributes
leadBean.fetch();
// Here were my attributes filled in with proper values including name
console.log(leadBean);
// Printed "undefined"
console.log(leadBean.attributes.name);
Das Problem war in fetch()
, der asynchrone Aufruf, sodass ich meinen Code neu schreiben musste:
var leadBean = app.data.createBean('Leads', {id: this.model.attributes.parent_id});
// This should load object with attributes
leadBean.fetch({
success: function (lead) {
// Printed my value correctly
console.log(lead.attributes.name);
}
});
2018 warnt uns Mozilla in den Mozilla Docs hier !
Ich zitiere "Protokollierungsobjekte":
Verwenden Sie nicht
console.log(obj);
, benutzeconsole.log(JSON.parse(JSON.stringify(obj)));
.Auf diese Weise können Sie sicher sein, dass Sie im Moment den Wert von obj sehen. Sie protokollieren es.