Ci-dessous, vous pouvez voir la sortie de ces deux journaux. Le premier montre clairement l'objet complet avec la propriété que j'essaie d'accéder, mais sur la ligne de code suivante, je ne peux pas y accéder avec config.col_id_3
(voir le "non défini" 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
aussi.
console.log(config);
console.log(config.col_id_3);
Voici ce que ces lignes impriment dans la console
javascript
console.log
Brian Litzinger
la source
la source
console.log(JSON.stringify(config));
et partager l'o / pJSON.parse(obj)
Réponses:
La sortie de
console.log(anObject)
est trompeuse; l'état de l'objet affiché n'est résolu que lorsque vous développez le>
dans la console. Ce n'est pas l'état de l'objet lorsque vousconsole.log
l' auriez fait .Au lieu de cela, essayez
console.log(Object.keys(config))
ou mêmeconsole.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 constaterez (généralement) que les clés sont ajoutées après votre
console.log
appel.la source
>
bouton est-il différent selon qu'un tableau est en cours d'extension ou un objet?Je viens d'avoir ce problème avec un document chargé à partir de MongoDB à l'aide de Mongoose .
Lors de l'exécution
console.log()
sur l'objet entier, tous les champs du document (tels que stockés dans la base de données) s'afficheraient. Cependant, certains accesseurs de propriété individuels reviendraientundefined
, alors que d'autres (y compris_id
) fonctionnaient bien.Il s'est avéré que les accesseurs de propriété ne fonctionnent que pour les champs spécifiés dans ma
mongoose.Schema(...)
définition,console.log()
etJSON.stringify()
retournent 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(...)
.la source
JSON.stringify()
(et les nœudsconsole.log()
) changent de comportement si l'objet donné a une.toJSON()
fonction. La sortie que vous voyez est ce qui.toJSON()
retourne, et non l'objet d'origine. Mongoose vous donne des objets de modèle avec un.toJSON()
qui donne l'objet db sous-jacent. L'objet modèle n'a que des accesseurs pour les champs que vous définissez dans le schéma, mais tous les champs db apparaissent alors lorsque vous le connectez car vous voyez réellement l'objet sous-jacent renvoyé par.toJSON()
.Vérifiez s'il y a à l'intérieur de l'objet un tableau d'objets. J'ai eu un problème similaire avec un JSON:
J'ai essayé d'accéder à la clé 'nom' de 'catégorie' et j'ai eu l' erreur non définie , car j'utilisais:
Ensuite, j'ai réalisé qu'il avait des crochets, ce qui signifie qu'il avait un tableau d'objets à l'intérieur de la clé de catégorie, car il pouvait avoir plus d'un objet de catégorie. Donc, pour obtenir la clé «nom», j'ai utilisé ceci:
Et cela 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 :)
la source
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. j'espère que cela vous est utile
la source
La propriété à laquelle vous essayez d'accéder n'existe peut-être pas encore. Console.log fonctionne car il s'exécute après un petit délai, mais ce n'est pas le cas pour le reste de votre code. Essaye ça:
la source
Dans mon cas, je passais un objet à une promesse, dans la promesse j'ajoutais plus de clés / valeurs à l'objet et quand c'était fait, la promesse renvoyait l'objet.
Cependant, un léger coup d'œil de ma part, la promesse était de retourner l'objet avant qu'il ne soit complètement 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 je n'ai pas pu accéder aux clés - elles revenaient indéfinies. Jusqu'à ce que je voie ceci:
Le [i] est une petite icône, quand je l'ai survolé, il a dit
Object value at left was snapshotted when logged, value below was evaluated just now
. C'est quand il m'est venu à l'esprit que mon objet était en cours d'évaluation avant que la promesse ne l'ait entièrement mis à jour.la source
J'ai eu du mal avec ce problème aujourd'hui et j'ai pensé laisser une réponse avec ma solution.
J'allais chercher un objet de données via ajax, quelque chose comme ceci:
{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
Supposons que cet objet se trouve dans une variable appelée données. Chaque fois que je faisais référence,
data.i18n
j'obtenaisundefined
.console.log(data)
a montré l'objet comme prévuconsole.log(Object.keys(data))
dit["constants","i18n"]
comme prévuRien n'a aidé ... Ensuite, côté serveur, j'ai écrit les données dans le journal php, et cela a révélé ceci:
{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}
Le "i" dans la clé d'index était en fait un u0456 (cyrillique i). Ce n'était pas visible dans mon éditeur php ou le journal de la console du navigateur. Seul le journal php a révélé cela ... C'était difficile ...
la source
Mes données n'étaient qu'une chaîne de données json. (Cette variable a été stockée sous forme de chaîne json dans la session).
-> renvoie uniquement la représentation de cette chaîne et il n'y a aucun moyen de faire la différence entre chaîne et objet.
Donc, pour le faire fonctionner, je devais juste le reconvertir en objet réel:
la source
En 2018, Mozilla nous avertit dans les documents Mozilla ici !
Je cite "Logging Objects" :
la source
Cela pourrait aider quelqu'un car j'avais un problème similaire dans lequel JSON.parse () renvoyait un objet que je pouvais imprimer sur la console.log () mais je ne pouvais pas 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 ().
J'ai fini par résoudre le problème en utilisant un analyseur différent fourni par ExtJs Ext.decode ();
la source
Dans mon cas, il se trouve que même si je reçois les données au format d'un
myMethod(data:MyModelClass)
objet modèle jusqu'à ce que l'objet reçu soit de type chaîne. Qui est y dans console.log (données), j'obtiens le contenu. La solution consiste simplement à analyser le JSON (dans mon cas)La pensée peut être utile.
la source
Je viens de rencontrer ce problème avec des objets générés par csv-parser à partir d'un fichier CSV généré par MS Excel. J'ai pu accéder à toutes les propriétés à l'exception de la première propriété - mais cela apparaîtrait bien si j'écrivais tout l'objet à l'aide de console.log.
Il s'est avéré que le format CSV UTF-8 insère au début 3 octets (ef bb bf) correspondant à un caractère invisible - qui étaient inclus dans le premier en-tête de propriété par csv-parser. La solution était de recréer le CSV en utilisant l'option non-UTF et cela a éliminé le caractère invisible.
la source
J'ai eu un problème similaire, j'espère que la solution suivante aide quelqu'un.
Vous pouvez utiliser la
setTimeout
fonction comme certains gars le suggèrent ici, mais vous ne savez jamais exactement combien de temps votre navigateur a besoin pour définir votre objet.En dehors de cela, je suggère d'utiliser la
setInterval
fonction à la place. Il attendra que votre objetconfig.col_id_3
soit défini, puis déclenchera votre prochaine partie de code qui nécessite vos propriétés d'objet spécifiques.la source
si vous utilisez
TYPESCRIPT
et / ouANGULAR
, ça pourrait être ça!.then((res: any) => res.json())
en définissant le type de réponse sur n'importe quel problème résolu pour moi, je ne pouvais pas accéder aux propriétés de la réponse jusqu'à ce que je définisse res: any
voir cette question La propriété '_body' n'existe pas sur le type 'Response'
la source
J'ai eu le même problème et aucune solution ci-dessus n'a fonctionné pour moi et cela ressemblait à un travail de devinette par la suite. Cependant, encapsuler mon code qui crée l'objet dans une
setTimeout
fonction a fait l'affaire pour moi.la source
J'ai eu un problème similaire ou peut-être simplement lié.
Pour mon cas, j'accédais aux propriétés d'un objet mais un n'était pas défini. J'ai trouvé que le problème était un espace blanc dans le code côté serveur lors de la création de la clé, val de l'objet.
Mon approche était la suivante ...
Après avoir supprimé l'espace blanc du code côté serveur créant l'objet, je pouvais maintenant accéder à la propriété comme ci-dessous ...
Ce n'est peut-être pas le problème avec le cas de la question, mais c'était pour mon cas et peut-être pour quelqu'un d'autre. J'espère que ça aide.
la source
Je viens d'avoir le même problème avec un document chargé à partir de MongoDB à l'aide de Mongoose.
Il s'est avéré que j'utilise la propriété
find()
pour renvoyer un seul objet, j'ai donc changéfind()
pourfindOne()
et tout a fonctionné pour moi.Solution (si vous utilisez Mongoose): assurez-vous de renvoyer un seul objet, de sorte que vous puissiez analyser son
object.id
ou il sera traité comme un tableau, vous devez donc y accéder comme çaobject[0].id
.la source
Pour moi, cela s'est avéré être un problème lié à la mangouste.
Je faisais une boucle sur des objets que j'ai obtenus d'une requête Mongo. Je devais juste retirer:
Et remplacez-le par:
la source
J'ai eu un problème comme celui-ci et j'ai trouvé que la solution était de faire avec Underscore.js. Mon enregistrement initial n'avait aucun sens:
J'ai trouvé la solution en regardant également les clés de l'objet:
Cela m'a amené à réaliser qu'il
obj
s'agissait en fait d'un wrapper Underscore.js autour d'un objet, et le débogage initial me mentait.la source
J'ai eu un problème similaire (lors du développement de SugarCRM), où je commence par:
Le problème était
fetch()
, son appel asynchrone donc j'ai dû réécrire mon code dans:la source
Juste au cas où cela serait 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:
Mais .toJSON () était:
Ainsi, lorsque j'ai appelé JSON.stringify (myObject), il a renvoyé "{" bar ":" Hello "," baz ":" World "}". Cependant, Object.keys (myObject) a révélé le "foo".
la source
toJson()
c'est le point que personne n'a mentionné ici. Je ne sais pas pourquoi cette réponse a été rejetée car c'est un moyen de créer un objet qui a une valeur différente de sa représentation json ou console. Je ne savais pas qu'elle existait jusqu'à ce que je la découvre dans une réponse différente, et je pense que cette réponse devrait être augmentée car c'est un point à considérer avec ce type de problèmes.J'ai fait face au même problème aujourd'hui. Dans mon cas, les clés étaient imbriquées, c'est-à-dire key1.key2. J'ai divisé les clés en utilisant split (), puis j'ai utilisé la notation entre crochets, qui a fonctionné pour moi.
J'ai divisé les clés et les ai utilisées comme ceci, les données [key1] [key2] qui ont fait le travail pour moi.
la source
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 uglifié, il a été résolu. Suppression de
de uglify-js suffisait pour avoir du code uglified fonctionnel.
Peut-être, la meilleure pratique consiste à utiliser un préfixe pour les propriétés qui doivent être modifiées avec la règle d'expression régulière pour uglify-js.
Voici la source:
et voici comment il a été uglifié:
la source
Aucun des JSON stringify / parse n'a fonctionné pour moi.
Je voulais la valeur de
formValues.myKey
et ce qui a fait l'affaire était un setTimeout 0 comme dans l'exemple ci-dessous. J'espère que ça aide.la source
Je viens de rencontrer ce problème également, et pour faire court, mon API renvoyait un type de chaîne et non JSON. Donc, il avait exactement la même apparence lorsque vous l'imprimiez dans le journal, mais chaque fois que j'essayais d'accéder aux propriétés, cela me donnait une erreur non définie.
Code API:
auparavant je revenais juste:
la source
J'ai eu un problème similaire aujourd'hui dans React. Finalement réalisé que le problème était dû au fait que l'état n'était pas encore défini. J'appelais
user.user.name
et bien qu'il apparaisse dans la console, je n'arrivais pas à y accéder dans mon composant jusqu'à ce que j'inclue une vérification pour vérifier s'iluser.user
était défini, puis que j'appelaisuser.user.name
.la source