webentwicklung-frage-antwort-db.com.de

Kann nicht auf Objekteigenschaften zugreifen, obwohl sie vorhanden sind. Gibt undefined zurück

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

Console output

242
Brian Litzinger

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.logd 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.

234
Matt

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.

36
ramin

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

21
Asaf Lopez

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);
18
Lai Xue

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);
15
Tope

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.

9
rolinger

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.

  1. console.log(data) zeigte das Objekt wie erwartet
  2. console.log(Object.keys(data)) sagte ["constants","i18n"] wie erwartet
  3. Das Umbenennen von i18n in inter hat nichts geändert
  4. Ich habe sogar versucht, die Daten zu wechseln, um "i18n" zum ersten Objekt zu machen
  5. Code wurde verschoben, um absolut sicher zu sein, dass das Objekt vollständig gesetzt wurde und es kein Problem mit dem Ajax-Versprechen gab.

Nichts 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 ...

8
Jette

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);
6
makkasi

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);
4
almcaffee

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...
3
user_CC

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

2
russiansummer

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

});
2
Lefan
config = JSON.parse(config);

Ich hatte dasselbe, die Daten waren ein Text und kein JSON, wie ich erwartet hatte.

1
obotezat

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.

1
Leonardo Atalla

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
});
1
Tushar Shukla

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 ...

 creating my object... notice the white-space in "Word"

 response I get from my REST API

 javascript code to log the values

 log results from console

Nach dem Entfernen des Leerraums aus dem serverseitigen Code, der das Objekt erstellt hat, konnte ich nun wie folgt auf die Eigenschaft zugreifen ...

 result after removing whitespace

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.

1
rey_coder

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.

1
Karthikeyan M

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.

0
Marcus Downing

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

0
itsKarma

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)
0
Ilja Kartašov

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.

0
C.O.G

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()
0
remi2j

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.

  1. Ich habe Anti-Caching auf die Browserlast meines js-Skripts gestellt quote: "Anhängen einer Abfragezeichenfolge"? V = 1 "an alle .css- und .js-Dateien, um das Zwischenspeichern zu verhindern."
  2. Ich habe ein zusätzliches Konsolenprotokoll erstellt, das ich modifiziere, bevor ich eine neue Anforderung ausprobiere: Console.log (""); Wenn dieses neue Protokoll nicht in der Konsole angezeigt wird, weiß ich, dass irgendwo ein Cacheproblem vorliegt .

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.

0
Frieda

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".

0
emote_control

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.

0
Mike Rizzo

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);
    }
});
0
Mariyo

2018 warnt uns Mozilla in den Mozilla Docs hier

Ich zitiere "Protokollierungsobjekte":

Verwenden Sie nicht console.log(obj);, benutze console.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.

0
MTZ