Impossible d'accéder à la propriété d'un objet, même s'il existe. Retourne undefined

c'est déconcertant. Je ne sais pas comment expliquer cela, mais voici ce que mon code de débogage ressemble. Ci-dessous, vous pouvez voir la sortie de ces deux journaux. La première montre clairement l'objet JavaScript complet avec la propriété à laquelle j'essaie d'accéder, mais le code de la ligne suivante Je ne peux pas y accéder avec config.col_id_3 (voir la "non définie" dans la capture d'écran?). Quelqu'un peut-il expliquer cela? Je peux accéder à toutes les autres propriétés sauf field_id_4.

console.log(config);
console.log(config.col_id_3);

C'est ce que ces consoles.journal (le)s d'impression dans la Console

Console output

219
demandé sur vulp 2013-07-09 15:22:16

26 réponses

La sortie de console.log(anObject) est trompeur; l'état de l'objet affiché n'est résolu lorsque vous développez le > dans la console. Il est pas l'état de l'objet lorsque vous console.log 'd l'objet.

à la place, essayez console.log(Object.keys(config)) , ou même console.log(JSON.stringify(config)) et vous verrez les clés, ou l'état de l'objet au moment où vous avez appelé console.log .

vous trouverez (habituellement) que les clés sont ajouté après votre appel console.log .

206
répondu Matt 2013-07-09 11:25:40

je viens d'avoir ce problème avec un document chargé de MongoDB en utilisant Mangoose .

lors de l'exécution de console.log() sur l'ensemble de l'objet, tous les champs de documents (tels que stockés dans la base de données) apparaîtraient. Toutefois, certains acquéreurs individuels retourneraient undefined , tandis que d'autres (y compris _id ) travailleraient très bien.

S'est avéré que les accesseurs de propriété ne fonctionne que pour les domaines spécifiés dans mon mongoose.Schema(...) définition, tandis que console.log() et JSON.stringify() renvoie tous les champs stockés dans la base de données.

Solution (si vous utilisez Mongoose) : assurez-vous que tous vos champs db sont définis dans mongoose.Schema(...) .

26
répondu ramin 2016-04-09 20:35:03

Vérifiez s'il y a un tableau d'objets à l'intérieur de l'objet. J'ai eu un problème similaire avec un JSON:

    "terms": {
        "category": [
            {
                "ID": 4,
                "name": "Cirugia",
                "slug": "cirugia",
                "description": "",
                "taxonomy": "category",
                "parent": null,
                "count": 68,
                "link": "http://distritocuatro.mx/enarm/category/cirugia/"
            }
        ]
    }

j'ai essayé d'accéder à la touche " nom " de "catégorie" et j'ai eu l'erreur non définie , parce que j'utilisais:

var_name = obj_array.terms.category.name

Puis j'ai réalisé qu'il a eu entre crochets, ce qui signifie qu'il a un tableau d'objets à l'intérieur de la catégorie clé, car il peut avoir plus d'une catégorie d'objet. Ainsi, afin d'obtenir la clé 'name' que j'ai utilisée:

var_name = obj_array.terms.category[0].name

et ça fait l'affaire.

peut-être qu'il est trop tard pour cette réponse, mais j'espère que quelqu'un avec le même problème trouvera cela comme je l'ai fait avant de trouver la Solution:)

20
répondu Asaf Lopez 2015-08-11 21:27:52

la propriété à laquelle vous tentez d'accéder n'existe peut-être pas encore. Console.log fonctionne parce qu'il exécute après un petit délai, mais ce n'est pas le cas pour le reste de votre code. Essayez ceci:

var a = config.col_id_3;    //undefined

setTimeout(function()
{
    var a = config.col_id_3;    //voila!

}, 100);
16
répondu Lai Xue 2017-09-30 16:30:18

j'ai eu le même problème. La Solution pour moi était d'utiliser la sortie stringifiée comme entrée pour analyser le JSON. cela a fonctionné pour moi. espérons que c'est utile pour vous

var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);
13
répondu Tope 2016-01-27 13:04:22

dans mon cas je passais un objet à une promesse, dans la promesse j'ajoutais plus de clé/valeurs à l'objet et quand il était fait la promesse retournait l'objet.

cependant, un léger sur-regard de ma part, la promesse était de retourner l'objet avant qu'il ne soit entièrement terminé...ainsi, le reste de mon code essayait de traiter l'objet mis à jour et les données n'étaient pas encore là. Mais comme ci-dessus, dans la console, j'ai vu l'objet entièrement mis à jour mais n'a pas été en mesure de accédez aux clés - elles revenaient indéterminées. Jusqu'à ce que je voie ceci:

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*

le [i] est une petite icône, quand je planais dessus il disait Object value at left was snapshotted when logged, value below was evaluated just now . C'est alors que je me suis rendu compte que mon objet était évalué avant que la promesse ne l'ait entièrement mis à jour.

7
répondu rolinger 2016-09-21 02:18:37

j'ai lutté avec cette question aujourd'hui, et j'ai pensé que je vais laisser une réponse avec ma solution.

je récupérais un objet de données via ajax, quelque chose comme ça: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

disons que cet objet est dans une variable appelée data. Chaque fois que j'ai fait référence à data.i18n j'ai eu undefined .

  1. console.log(data) montre l'objet comme prévu
  2. console.log(Object.keys(data)) dit ["constants","i18n"] comme prévu
  3. Renommer i18n à inter ne rien changer
  4. j'ai même essayé de changer les données pour faire "i18n" le premier objet
  5. a déplacé le code autour pour s'assurer absolument que l'objet était complètement réglé et il n'y avait aucun problème avec la promesse ajax.

rien n'a aidé... Puis du côté du serveur, j'ai écrit les données dans le log de php, et il révélé ceci:

{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}

le" i " dans la clé d'index était en fait u0456 (cyrillic i). Cela n'était pas visible dans mon éditeur php ou dans le journal de la console du navigateur. Seul le journal php l'a révélé... C'était une question délicate...

6
répondu Jette 2016-02-24 13:11:11

mes données n'étaient que des données JSON. (Cette variable a été stockée sous forme de chaîne json dans la session).

console.log(json_string_object)

- > renvoie juste la représentation de cette chaîne et il n'y a aucun moyen de faire une différence si c'est une chaîne ou un objet.

alors pour que ça marche, j'ai juste eu besoin de le convertir en objet réel:

object = JSON.parse(json_string_object);
6
répondu makkasi 2016-11-01 15:27:02

si vous utilisez le typographie et / ou L'ANGULAR, ça pourrait être ça!!!!

.then((res: any) => res.json())

paramétrage du type de réponse à any correction de ce problème pour moi, Je ne pouvais pas accéder aux propriétés sur la réponse jusqu'à ce que je mette res: any "151970920

voir cette question Propriété "_body" n'existe pas sur le type "Réponse"

2
répondu russiansummer 2017-11-02 19:35:25

Je ne Poste pas ici beaucoup en raison de l'irritation de ne pas avoir assez de messages à commenter, mais le gars qui a posté ce ci-dessous avait raison. L'appel ajax n'était pas terminée lorsque vous avez tenté d'accéder à l'objet. J'irais même plus loin et utiliserais 500 au lieu de 100 pour le temps d'arrêt, juste pour être sûr.

var a = config.col_id_3;    //undefined

setTimeout(function()
{
    var a = config.col_id_3;    //voila!

}, 500);
2
répondu almcaffee 2018-05-28 15:21:52

Essayez avec config[0] ou config[0].col_id_3

je viens d'avoir ce problème aussi , j'ai pu voir un objet , l'enregistrer, mais pas y accéder à partir du code. J'ai alors essayé d'ajouter un [0] devant et j'ai résolu mon problème. Je pourrais alors accéder à toutes les propriétés.

1
répondu Leonardo Atalla 2016-07-14 21:28:10
config = JSON.parse(config);

j'avais la même chose, les données étaient un texte et pas un JSON comme je m'y attendais.

1
répondu obotezat 2016-08-24 14:18:25

j'ai eu le même problème et aucune solution ci-dessus travaillé pour moi et il sorte de se sentait comme le travail de devinette par la suite. Cependant, envelopper mon code qui crée l'objet dans une fonction setTimeout a fait l'affaire pour moi.



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
répondu Tushar Shukla 2017-03-15 07:21:09

j'ai eu un problème similaire ou peut-être juste lié.

pour mon cas, j'accédais aux propriétés d'un objet, mais l'une d'elles n'était pas définie. J'ai trouvé le problème était un espace blanc dans le code côté serveur tout en créant la clé,val de l'objet.

mon approche était la suivante...

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

après avoir supprimé l'espace blanc du code côté serveur qui crée l'objet, je peux maintenant accéder à la propriété comme ci-dessous...

result after removing whitespace

ce n'est peut-être pas le problème avec le cas de la question à l'étude, mais c'était pour mon cas. et peut-être pour quelqu'un d'autre. Espérons que cela aide.

1
répondu rey_coder 2017-04-20 08:11:17

cela pourrait aider quelqu'un que j'ai eu un problème similaire dans lequel le JSON.parse () retournait un objet que je pouvais imprimer sur la console.log () mais je n'ai pas pu accéder aux champs spécifiques et aucune des solutions ci-dessus ne fonctionnait pour moi. Comme utiliser la combinaison de JSON.parse() avec 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  

j'ai fini par résoudre le problème en utilisant un autre analyseur fourni par ExtJs Ext.decode ();

var jsonObj = Ext.decode(responseText)
console.log(jsonObj.Body) //Worked...
1
répondu user_CC 2018-02-16 17:26:51

Dans Mon cas, c'est juste que même si je recevoir les données dans le format d'un modèle comme myMethod(data:MyModelClass) objet jusqu'à la réception de l'objet de type string. Qui est Y dans la console.log(data), je reçois le contenu. La Solution est juste de parser le JSON (dans mon cas)

const model:MyMOdelClass=JSON.parse(data);

peut être utile.

1
répondu Karthikeyan M 2018-07-29 05:43:54

j'ai eu un problème comme celui-ci, et j'ai trouvé la solution était à faire avec Underscore.js. Mon enregistrement initial n'avait aucun sens:

console.log(JSON.stringify(obj, null, 2));

> {
>   "code": "foo"
> }

console.log(obj.code);

> undefined

j'ai trouvé la solution en regardant également les clés de l'objet:

console.log(JSON.stringify(Object.keys(obj)));

> ["_wrapped","_chain"]

cela m'amène à réaliser que obj était en fait un Underscore.js wraper autour d'un objet, et le débogage initial m'a menti.

0
répondu Marcus Downing 2016-05-06 11:08:25

j'ai eu le même problème (lors du développement pour SugarCRM), où je commence par:

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

problème était dans fetch() , son appel async donc j'ai dû réécrire mon code en:

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
répondu Mariyo 2017-06-01 09:43:26

excellentes suggestions ici. J'ajouterai que quelqu'un pourrait le trouver utile.

être très conscient de la mise en cache, dans le navigateur ou à distance.

j'étais aux prises avec ce problème , car je développe en ligne, et mis en œuvre une stratégie simple.

  1. j'ai mis l'anti-cache sur le navigateur de mon script js. citation: "ajouter une chaîne de requête "?v=1" à tous .css et .fichiers js pour empêcher la mise en cache."
  2. j'ai mis un journal de bord supplémentaire de la console que je modifie avant d'essayer une nouvelle requête: console.journal(""); Si Je ne vois pas ce nouveau log dans la console, je sais que j'ai un problème de cache quelque part.

une Fois que j'ai eu la syntaxe correcte, j'ai supprimé le délai suggéré plus tôt, et tout est bon. Pour moi, je devais utiliser, " JSON.stringify ("

0
répondu Frieda 2017-07-31 17:07:04

Juste au cas où c'est utile pour quelqu'un, j'ai eu un problème similaire, et c'est parce que quelqu'un a créé un remplacement pour .toJSON dans l'objet avec lequel je travaillais. Donc l'objet était quelque chose comme:

{
  foo: {
         bar: "Hello"
         baz: "World"
       }
}

mais .toJSON () était:

toJSON() {
  return this.foo
}

donc quand j'ai appelé JSON.stringify(monobjet) il est revenu "{"bar": "Bonjour", "baz": "Monde"}". Toutefois, L'Objet.keys (myObject) a révélé le "foo".

0
répondu emote_control 2017-08-11 20:35:37

excellentes suggestions. Je viens d'avoir le même problème donc mes deux cents. Une chose qui a résolu le problème a été l'ajout de 'JSON: true' dans les options de ma requête. (cela dépend évidemment de la bibliothèque que vous utilisez, mais le principe général est le même - spécifiez le format de contenu que vous attendez de recevoir.)

0
répondu itsKarma 2017-08-16 15:13:02

j'ai fait face au même problème aujourd'hui. Dans mon cas, les clés étaient imbriquées.e key1.touche2. J'ai divisé les touches en utilisant split() et j'ai ensuite utilisé la notation du crochet carré, qui a fonctionné pour moi.

var data = {
    key1: {
          key2: "some value"
       }
}

j'ai divisé les touches et je l'ai utilisé comme ceci, les données[key1][key2] qui ont fait le travail pour moi.

0
répondu C.O.G 2017-10-11 21:20:51

j'ai eu le même problème aujourd'hui. Le problème a été causé par uglify-js. Après avoir exécuté le même problème de code non-uglified a été résolu. Suppression de

--mangle-props

d'uglify-js était suffisant pour avoir du code uglifié.

la meilleure pratique consiste peut-être à utiliser un préfixe pour les propriétés qui doivent être altérées par la règle regex pour uglify-js.

Voici la source:

var data = JSON.parse( content);
...
this.pageIndex = parseInt(data.index);
this.pageTotal = parseInt(data.total);
this.pageLimit = parseInt(data.limit); 

et voici comment

var n = JSON.parse( t);
...
this._ = parseInt(n.index), this.g = parseInt(n.total), this.D = parseInt(n.C)
0
répondu Ilja Kartašov 2018-01-25 13:07:37

en 2018 Mozilla nous avertit dans le Mozilla Docs ici !

je cite "objets de journalisation" :

Ne pas utiliser console.log(obj); , utilisez console.log(JSON.parse(JSON.stringify(obj))); .

de cette façon vous êtes sûr que vous voyez la valeur d'obj en ce moment vous vous connectez.

0
répondu Mateut Alin 2018-02-26 13:48:21

je viens d'avoir le même problème avec un document chargé de MongoDB en utilisant Mongoose.

S'est avéré que j'utilise la propriété find() pour retourner un seul objet, donc j'ai changé find() en findOne() et tout a fonctionné pour moi.

Solution (si vous utilisez Mongoose): assurez-vous de retourner un seul objet, de sorte que vous pouvez analyser son object.id ou il sera traité comme un tableau de sorte que vous avez besoin de l'accès comme object[0].id .

0
répondu Mohamed Hassan Kadri 2018-04-19 13:54:53

j'ai eu ce même problème en travaillant avec une fonction qui fait un appel ajax. Dans mon cas, j'avais de la difficulté à obtenir un code d'erreur valide du serveur. C'est la fonction:

function getListItem(listItemUri){
    return jQuery.ajax({
        url: listItemUri,
        type: "Get",
        headers: { "accept": "application/json;odata=verbose" }
    });
}

le code ci-dessous était incorrect, et montrerait l'objet dans la console, mais serait non défini en essayant d'y accéder.

var list = getListItem(uri);
var failed = list.fail(onerror);
console.log(failed);  //displays object which included a status
console.log(obj.status); //but when trying to retrieve the status message it was undefined

Le code ci-dessous m'a permis d'accéder aux valeurs de l'objet. La clé était dans utiliser la liste.l'échec comme une fonction au lieu de l'affecter à une variable.

var list = getListItem(uri);

list.fail(function(obj){
    console.log(obj); //displays object
    console.log(obj.status); //the object is now defined and I am able to see the error code returned by the server
});
-1
répondu Jeremy 2016-12-14 00:16:58