Abaixo, você pode ver a saída desses dois logs. O primeiro mostra claramente o objeto completo com a propriedade que estou tentando acessar, mas na próxima linha de código não consigo acessá-lo config.col_id_3
(consulte o "indefinido" na captura de tela?). Alguém pode explicar isso? Eu posso ter acesso a qualquer outra propriedade, exceto field_id_4
também.
console.log(config);
console.log(config.col_id_3);
É isso que essas linhas imprimem no console
javascript
console.log
Brian Litzinger
fonte
fonte
console.log(JSON.stringify(config));
ans compartilhar o / pJSON.parse(obj)
Respostas:
A saída de
console.log(anObject)
é enganosa; o estado do objeto exibido só é resolvido quando você expande o>
no console. É não o estado do objeto quando vocêconsole.log
'd o objeto.Em vez disso, tente
console.log(Object.keys(config))
, ou mesmo,console.log(JSON.stringify(config))
e você verá as chaves ou o estado do objeto no momento em que chamouconsole.log
.Você (normalmente) encontrará as chaves que estão sendo adicionadas após a sua
console.log
ligação.fonte
>
botão é diferente dependendo se uma matriz está sendo expandida ou um objeto?Acabei de ter esse problema com um documento carregado do MongoDB usando o Mongoose .
Ao executar
console.log()
em todo o objeto, todos os campos do documento (como armazenados no banco de dados) apareceriam. No entanto, alguns acessadores individuais de propriedades retornariamundefined
quando outros (inclusive_id
) funcionassem bem.Descobriu-se que os assessores da propriedade só funciona para os campos especificados na minha
mongoose.Schema(...)
definição, enquanto queconsole.log()
eJSON.stringify()
retorna todos os campos armazenados no banco de dados.Solução (se você estiver usando o Mongoose) : verifique se todos os seus campos db estão definidos em
mongoose.Schema(...)
.fonte
JSON.stringify()
(e os nósconsole.log()
) alteram seu comportamento se o objeto fornecido tiver uma.toJSON()
função. A saída que você vê é o que.toJSON()
retorna, e não o objeto original. O Mongoose fornece objetos de modelo com um.toJSON()
que fornece o objeto db subjacente. O objeto de modelo possui apenas acessadores para os campos que você define no esquema, mas todos os campos db aparecem quando você o registra, porque na verdade está vendo o objeto subjacente retornado por.toJSON()
.Verifique se dentro do objeto há uma matriz de objetos. Eu tive um problema semelhante com um JSON:
Tentei acessar a chave 'name' em 'category' e recebi o erro indefinido , porque estava usando:
Então eu percebi que ele tem colchetes, o que significa que ele tem uma matriz de objetos dentro da chave de categoria, porque pode ter mais de um objeto de categoria. Então, para obter a chave 'name', usei isso:
E isso faz o truque.
Talvez seja tarde demais para esta resposta, mas espero que alguém com o mesmo problema encontre isso como eu antes de encontrar a solução :)
fonte
Eu tive o mesmo problema. A solução para mim foi usar a saída stringified como entrada para analisar o JSON. isso funcionou para mim. espero que seja útil para você
fonte
A propriedade que você está tentando acessar talvez ainda não exista. O Console.log funciona porque é executado após um pequeno atraso, mas esse não é o caso do restante do seu código. Tente o seguinte:
fonte
No meu caso, eu estava passando um objeto para uma promessa, dentro da promessa estava adicionando mais valores / chave ao objeto e, quando isso foi feito, a promessa retornou o objeto.
No entanto, um pouco da minha parte, a promessa estava retornando o objeto antes de ser totalmente concluído ... assim, o resto do meu código estava tentando processar o objeto atualizado e os dados ainda não estavam lá. Mas, como acima, no console, vi o objeto totalmente atualizado, mas não consegui acessar as chaves - elas estavam voltando indefinidas. Até que eu vi isso:
O [i] é um pequeno ícone, quando passei o mouse sobre ele
Object value at left was snapshotted when logged, value below was evaluated just now
. Foi quando me ocorreu que meu objeto estava sendo avaliado antes que a promessa o atualizasse completamente.fonte
Lutei com esse problema hoje e pensei em deixar uma resposta com minha solução.
Eu estava buscando um objeto de dados via ajax, algo como isto:
{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
Digamos que esse objeto esteja em uma variável chamada data. Sempre que me referi
data.i18n
, recebiundefined
.console.log(data)
mostrou o objeto como esperadoconsole.log(Object.keys(data))
disse["constants","i18n"]
como esperadoNada ajudou ... Então, no lado do servidor, escrevi os dados no log do php, e ele revelou o seguinte:
{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}
O "i" na chave de índice era na verdade um u0456 (i cirílico). Isso não estava visível no meu editor de php ou no log do console do navegador. Apenas o log php revelou isso ... Isso foi complicado ...
fonte
Meus dados eram apenas json data string. (Esta variável foi armazenada como string json na sessão).
-> retorna apenas a representação dessa string e não há como fazer diferença, seja string ou objeto.
Então, para fazê-lo funcionar, eu só precisava convertê-lo novamente em objeto real:
fonte
Em 2018, a Mozilla nos avisa no Mozilla Docs aqui !
Cito "Objetos de Log" :
fonte
Isso pode ajudar alguém, pois tive um problema semelhante no qual o JSON.parse () estava retornando um objeto que eu poderia imprimir no console.log (), mas não consegui acessar os campos específicos e nenhuma das soluções acima funcionou. mim. Como usar a combinação de JSON.parse () com JSON.stringify ().
Acabei resolvendo o problema usando um analisador diferente fornecido pelo ExtJs Ext.decode ();
fonte
No meu caso, acontece que mesmo que eu receba os dados no formato de um modelo como
myMethod(data:MyModelClass)
objeto até que o objeto recebido seja do tipo string. Qual é y no console.log (dados) eu recebo o conteúdo. A solução é apenas analisar o JSON (no meu caso)O pensamento pode ser útil.
fonte
Acabei de encontrar esse problema com objetos gerados pelo csv-parser a partir de um arquivo CSV gerado pelo MS Excel. Eu era capaz de acessar todas as propriedades, exceto a primeira propriedade - mas ela apareceria bem se eu escrevesse o objeto inteiro usando o console.log.
Descobriu-se que o formato CSV UTF-8 insere 3 bytes (ef bb bf) no início, correspondendo a um caractere invisível - que estavam sendo incluídos como parte do primeiro cabeçalho da propriedade pelo csv-parser. A solução foi gerar novamente o CSV usando a opção não UTF e isso eliminou o caractere invisível.
fonte
Eu tive um problema semelhante, espero que a seguinte solução ajude alguém.
Você pode usar
setTimeout
função como alguns caras sugerem aqui, mas você nunca sabe quanto tempo exatamente o seu navegador precisa para definir seu objeto.Fora disso, eu sugiro usar a
setInterval
função. Ele aguardará até que seu objetoconfig.col_id_3
seja definido e, em seguida, disparará sua próxima parte do código que requer suas propriedades específicas.fonte
se você estiver usando
TYPESCRIPT
e / ouANGULAR
, pode ser isso!.then((res: any) => res.json())
definindo o tipo de resposta para qualquer problema corrigido para mim, não consegui acessar as propriedades na resposta até definir res: any
consulte esta pergunta A propriedade '_body' não existe no tipo 'Response'
fonte
Eu tive o mesmo problema e nenhuma solução acima funcionou para mim e, mais tarde, pareceu um palpite. No entanto, agrupar meu código que cria o objeto em uma
setTimeout
função fez o truque para mim.fonte
Eu tive um problema semelhante ou talvez apenas relacionado.
Para o meu caso, eu estava acessando propriedades de um objeto, mas um não estava definido. Descobri que o problema era um espaço em branco no código do lado do servidor ao criar a chave val do objeto.
Minha abordagem foi a seguinte ...
Depois de remover o espaço em branco do código do servidor criando o objeto, agora eu podia acessar a propriedade como abaixo ...
Esse pode não ser o problema com o caso da questão, mas foi para o meu caso e pode ser para outra pessoa. Espero que ajude.
fonte
Acabei de ter o mesmo problema com um documento carregado do MongoDB usando o Mongoose.
Descobri que estou usando a propriedade
find()
para retornar apenas um objeto, então mudeifind()
parafindOne()
e tudo funcionou para mim.Solução (se você estiver usando o Mongoose): certifique-se de retornar apenas um objeto, para poder analisá
object.id
-lo ou ele será tratado como uma matriz, para que você precise acessá-lo dessa maneiraobject[0].id
.fonte
Para mim, acabou por ser um problema relacionado ao Mongoose.
Eu estava repetindo os objetos que obtive de uma consulta Mongo. Eu apenas tive que remover:
E substitua-o por:
fonte
Eu tive um problema como esse e achei a solução relacionada ao Underscore.js. Meu log inicial não fazia sentido:
Encontrei a solução também olhando as chaves do objeto:
Isso me levou a perceber que
obj
era realmente um invólucro Underscore.js em torno de um objeto, e a depuração inicial estava mentindo para mim.fonte
Eu tive um problema semelhante (ao desenvolver para o SugarCRM), onde começo com:
O problema estava
fetch()
, sua chamada assíncrona, então eu tive que reescrever meu código em:fonte
Caso isso seja útil para alguém, tive um problema semelhante e é porque alguém criou uma substituição para .toJSON no objeto com o qual estava trabalhando. Então o objeto era algo como:
Mas .toJSON () era:
Então, quando chamei JSON.stringify (myObject), ele retornou "{" bar ":" Hello "," baz ":" World "}". No entanto, Object.keys (myObject) revelou o "foo".
fonte
toJson()
este é o ponto que ninguém mencionou aqui. Não sei por que essa resposta foi recusada, pois essa é uma maneira de criar um objeto que tem um valor diferente de sua representação em json ou console. Eu não sabia que ela existia até que a descobri em uma resposta diferente, e acho que essa resposta deve ser votada, pois é um ponto a ser considerado com esses tipos de problemas.Eu enfrentei o mesmo problema hoje. No meu caso, as chaves estavam aninhadas, ou seja, key1.key2. Dividi as teclas usando split () e depois usei a notação de colchete, que funcionou para mim.
Eu dividi as chaves e usei assim, dados [chave1] [chave2] que fizeram o trabalho para mim.
fonte
Eu tive o mesmo problema hoje. O problema foi causado por uglify-js. Depois que eu executei o mesmo problema de código não uglificado foi resolvido. Remoção de
do uglify-js foi suficiente para ter um código uglificado em funcionamento.
Talvez, a melhor prática seja usar algum prefixo para propriedades que precisam ser alteradas com a regra regex para uglify-js.
Aqui está a fonte:
e aqui está como foi uglificado:
fonte
Nenhum dos JSON stringify / parse funcionou para mim.
Eu queria o valor de
formValues.myKey
e o que fez o truque foi um setTimeout 0 como no exemplo abaixo. Espero que ajude.fonte
Acabei de encontrar esse problema também e, para encurtar a história, minha API estava retornando um tipo de cadeia de caracteres e não JSON. Portanto, parecia exatamente o mesmo quando você o imprimia no log, no entanto, sempre que eu tentava acessar as propriedades, isso me dava um erro indefinido.
Código da API:
anteriormente eu estava voltando:
fonte
Hoje tive um problema semelhante no React. Eventualmente, percebi que o problema estava sendo causado pelo estado ainda não estar definido. Eu estava ligando
user.user.name
e, embora estivesse aparecendo no console, não consegui acessá-lo no meu componente até incluir uma verificação para verificar seuser.user
estava definido e depois ligaruser.user.name
.fonte