A continuación, puede ver el resultado de estos dos registros. El primero muestra claramente el objeto completo con la propiedad a la que estoy intentando acceder, pero en la siguiente línea de código, no puedo acceder a él config.col_id_3
(¿ves el "indefinido" en la captura de pantalla?). ¿Alguien puede explicar esto? Puedo obtener acceso a todas las demás propiedades, excepto field_id_4
también.
console.log(config);
console.log(config.col_id_3);
Esto es lo que imprimen estas líneas en la consola
javascript
console.log
Brian Litzinger
fuente
fuente
console.log(JSON.stringify(config));
y compartir la o / pJSON.parse(obj)
Respuestas:
La salida de
console.log(anObject)
es engañosa; el estado del objeto que se muestra solo se resuelve cuando expande>
en la consola. Es no el estado del objeto cuando seconsole.log
'd del objeto.En su lugar, intente
console.log(Object.keys(config))
, o incluso,console.log(JSON.stringify(config))
y verá las teclas o el estado del objeto en el momento en que llamóconsole.log
.Encontrará (generalmente) que las claves se están agregando después de su
console.log
llamada.fuente
>
botón es diferente dependiendo de si una matriz se está expandiendo o un objeto?Acabo de tener este problema con un documento cargado desde MongoDB usando Mongoose .
Cuando se ejecuta
console.log()
en todo el objeto, aparecerían todos los campos del documento (como se almacenan en la base de datos). Sin embargo, algunos accesores de propiedades individuales regresaríanundefined
, cuando otros (incluidos_id
) funcionaron bien.Resultó que los accesores de propiedad solo funcionan para los campos especificados en mi
mongoose.Schema(...)
definición, mientras queconsole.log()
yJSON.stringify()
devuelve todos los campos almacenados en la base de datos.Solución (si está usando Mongoose) : asegúrese de que todos sus campos db estén definidos
mongoose.Schema(...)
.fuente
JSON.stringify()
(y Node'sconsole.log()
) cambian su comportamiento si el objeto dado tiene una.toJSON()
función. El resultado que ve es lo que.toJSON()
devuelve, y no el objeto original. Mongoose te da objetos modelo con un.toJSON()
que da el objeto db subyacente. El objeto modelo solo tiene accesores para los campos que define en el esquema, pero luego todos los campos db aparecen cuando lo registra porque realmente está viendo el objeto subyacente devuelto por.toJSON()
.Compruebe si dentro del objeto hay una matriz de objetos. Tuve un problema similar con un JSON:
Traté de acceder a la clave 'nombre' desde 'categoría' y obtuve el error indefinido , porque estaba usando:
Luego me di cuenta de que tiene corchetes, lo que significa que tiene una matriz de objetos dentro de la clave de categoría, porque puede tener más de un objeto de categoría. Entonces, para obtener la clave 'nombre', utilicé esto:
Y eso hace el truco.
Tal vez sea demasiado tarde para esta respuesta, pero espero que alguien con el mismo problema lo encuentre antes que encontrar la solución :)
fuente
Tuve el mismo problema. La solución para mí fue usar la salida en cadena como entrada para analizar el JSON. Esto funcionó para mí. espero que te sea útil
fuente
Es posible que la propiedad a la que intentas acceder todavía no exista. Console.log funciona porque se ejecuta después de un pequeño retraso, pero ese no es el caso para el resto de su código. Prueba esto:
fuente
En mi caso, estaba pasando un objeto a una promesa, dentro de la promesa estaba agregando más claves / valores al objeto y cuando se hizo, la promesa devolvió el objeto.
Sin embargo, una ligera mirada de mi parte, la promesa era devolver el objeto antes de que estuviera completamente terminado ... por lo tanto, el resto de mi código estaba tratando de procesar el objeto actualizado y los datos aún no estaban allí. Pero como en el caso anterior, en la consola, vi el objeto completamente actualizado, pero no pude acceder a las teclas, volvían indefinidas. Hasta que vi esto:
El [i] es un pequeño ícono, cuando lo pasé sobre él decía
Object value at left was snapshotted when logged, value below was evaluated just now
. Fue entonces cuando se me ocurrió que mi objeto estaba siendo evaluado antes de que la promesa lo hubiera actualizado por completo.fuente
Luché con este problema hoy, y pensé que dejaría una respuesta con mi solución.
Estaba buscando un objeto de datos a través de ajax, algo como esto:
{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
Digamos que este objeto está en una variable llamada datos. Cada vez que hice referencia
data.i18n
me dieronundefined
.console.log(data)
mostró el objeto como se esperabaconsole.log(Object.keys(data))
dijo["constants","i18n"]
como se esperabaNada ayudó ... Luego, en el lado del servidor, escribí los datos en el registro de php, y reveló esto:
{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}
La "i" en la clave de índice era en realidad un u0456 (cirílico i). Esto no estaba visible en mi editor php o en el registro de la consola del navegador. Solo el registro de php reveló esto ... Eso fue complicado ...
fuente
Mis datos eran solo cadenas de datos json. (Esta variable se almacenó como cadena json en la sesión).
-> devuelve solo la representación de esta cadena y no hay forma de diferenciar si es cadena u objeto.
Entonces, para que funcione, solo necesitaba convertirlo de nuevo a objeto real:
fuente
En 2018, Mozilla nos advierte en los documentos de Mozilla aquí !
Cito "Logging Objects" :
fuente
Esto podría ayudar a alguien ya que tuve un problema similar en el que JSON.parse () estaba devolviendo un objeto que podía imprimir en console.log () pero no pude acceder a los campos específicos y ninguna de las soluciones anteriores funcionó yo. Como usar la combinación de JSON.parse () con JSON.stringify ().
Terminé resolviendo el problema usando un analizador diferente proporcionado por ExtJs Ext.decode ();
fuente
En mi caso, resulta que a pesar de que recibo los datos en el formato de un modelo como
myMethod(data:MyModelClass)
objeto hasta que el objeto recibido era de tipo cadena. Que es y en console.log (data) obtengo el contenido. La solución es solo analizar el JSON (en mi caso)El pensamiento puede ser útil.
fuente
Acabo de encontrar este problema con los objetos generados por csv-parser a partir de un archivo CSV que fue generado por MS Excel. Pude acceder a todas las propiedades excepto a la primera propiedad, pero aparecería bien si escribiera todo el objeto usando console.log.
Resultó que el formato CST UTF-8 inserta 3 bytes (ef bb bf) al inicio correspondiente a un carácter invisible, que se incluyó como parte del primer encabezado de propiedad por csv-parser. La solución fue volver a generar el CSV utilizando la opción no UTF y esto eliminó el carácter invisible.
fuente
He tenido un problema similar, espero que la siguiente solución ayude a alguien.
Puedes usar
setTimeout
función como sugieren algunos tipos aquí, pero nunca se sabe exactamente cuánto tiempo necesita su navegador para definir su objeto.Fuera de eso, sugeriría usar la
setInterval
función en su lugar. Esperará hasta que su objetoconfig.col_id_3
se defina y luego disparará su siguiente parte de código que requiere sus propiedades de objeto específicas.fuente
si estás usando
TYPESCRIPT
y / oANGULAR
, ¡podría ser esto!.then((res: any) => res.json())
ajustar el tipo de respuesta a cualquier fijo este problema para mí, no pude acceder a las propiedades de la respuesta hasta que establecer res: cualquier
vea esta pregunta La propiedad '_body' no existe en el tipo 'Respuesta'
fuente
Tuve el mismo problema y ninguna de las soluciones anteriores funcionó para mí y de alguna manera se sintió como adivinar a partir de entonces. Sin embargo, envolver mi código que crea el objeto en una
setTimeout
función fue el truco para mí.fuente
Tuve un problema similar o tal vez solo relacionado.
Para mi caso, estaba accediendo a las propiedades de un objeto pero uno no estaba definido. Encontré que el problema era un espacio en blanco en el código del lado del servidor al crear la clave, val del objeto.
Mi enfoque fue el siguiente ...
Después de eliminar el espacio en blanco del código del lado del servidor que crea el objeto, ahora podía acceder a la propiedad de la siguiente manera ...
Este podría no ser el problema con el caso de la pregunta del tema, pero fue para mi caso y puede serlo para alguien más. Espero eso ayude.
fuente
Acabo de tener el mismo problema con un documento cargado desde MongoDB usando Mongoose.
Resultó que estoy usando la propiedad
find()
para devolver solo un objeto, así que cambiéfind()
afindOne()
y todo funcionó para mí.Solución (si está usando Mongoose): asegúrese de devolver un solo objeto, para que pueda analizarlo
object.id
o se lo tratará como una matriz, por lo que debe acceder de esa maneraobject[0].id
.fuente
Para mí resultó ser un problema relacionado con la mangosta.
Estaba recorriendo objetos que obtuve de una consulta de Mongo. Solo tuve que eliminar:
Y reemplazarlo por:
fuente
Tuve un problema como este y descubrí que la solución tenía que ver con Underscore.js. Mi registro inicial no tenía sentido:
Encontré la solución también mirando las claves del objeto:
Esto me llevó a darme cuenta de que en
obj
realidad era un envoltorio Underscore.js alrededor de un objeto, y la depuración inicial me estaba mintiendo.fuente
Tuve un problema similar (cuando desarrollé para SugarCRM), donde comienzo con:
El problema estaba en
fetch()
su llamada asíncrona, así que tuve que volver a escribir mi código en:fuente
En caso de que esto sea útil para alguien, tuve un problema similar, y es porque alguien creó una anulación para .toJSON en el objeto con el que estaba trabajando. Entonces el objeto era algo así como:
Pero .toJSON () fue:
Entonces, cuando llamé a JSON.stringify (myObject), devolvió "{" bar ":" Hola "," baz ":" Mundo "}". Sin embargo, Object.keys (myObject) reveló el "foo".
fuente
toJson()
Este es el punto que nadie ha mencionado aquí. No sé por qué esta respuesta fue rechazada, ya que esta es una forma de crear un objeto que tiene un valor diferente de su representación json o consola. No sabía que existía hasta que lo descubrí en una respuesta diferente, y creo que esta respuesta debería ser votada ya que es un punto a considerar con este tipo de problemas.Me enfrenté al mismo problema hoy. En mi caso, las claves estaban anidadas, es decir, key1.key2. Dividí las teclas usando split () y luego usé la notación de corchetes, que funcionó para mí.
Dividí las claves y las usé así, datos [clave1] [clave2] que hicieron el trabajo por mí.
fuente
Tuve el mismo problema hoy. El problema fue causado por uglify-js. Después de ejecutar el mismo problema de código no uglified, se resolvió. Eliminación de
desde uglify-js fue suficiente para tener código uglified en funcionamiento.
Quizás, la mejor práctica es usar algún prefijo para las propiedades que tienen que ser modificadas con la regla regex para uglify-js.
Aquí está la fuente:
y así es como se uglificó:
fuente
Ninguno de los JSON stringify / parse funcionó para mí.
Quería el valor de
formValues.myKey
y lo que hizo el truco fue un setTimeout 0 como en el ejemplo a continuación. Espero eso ayude.fuente
También me encontré con este problema, y para resumir, mi API estaba devolviendo un tipo de cadena y no JSON. Así que se veía exactamente igual cuando lo imprimiste en el registro; sin embargo, cada vez que intentaba acceder a las propiedades me daba un error indefinido.
Código API:
anteriormente solo volvía:
fuente
Tuve un problema similar hoy en React. Eventualmente me di cuenta de que el problema estaba siendo causado por el estado que aún no se había establecido. Estaba llamando
user.user.name
y, aunque aparecía en la consola, parecía que no podía acceder a él en mi componente hasta que incluí un cheque para verificar siuser.user
estaba configurado y luego llaméuser.user.name
.fuente