在下面,您可以看到这两个日志的输出。第一个清楚地显示了我要访问的具有属性的完整对象,但是在下一行代码中,我无法使用config.col_id_3访问它(请参阅屏幕快照中的“未定义”?)。谁能解释一下?除了field_id_4之外,我还可以访问其他所有属性。

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


这是这些行在控制台中打印的内容



评论

你可以尝试console.log(JSON.stringify(config)); ans分享了o / p

如果可以正常工作,也可以尝试console.log(config ['col_id_3']);

这对我有用。使用字符串化的输出作为工作对象的新输入:JSON.parse(JSON.stringify(obj))

出于某种原因,先进行字符串化然后解析无法解决该问题。但是完全解析。 JSON.parse(obj)

出于某种原因,所有答案都说明了如何在没有密钥的情况下记录对象,而不是如何访问密钥

#1 楼

console.log(anObject)的输出具有误导性;仅当通过单击>展开控制台中显示的“对象”树时,才能解决显示的对象的状态。当您对对象进行console.log时,它不是对象的状态。相反,请尝试console.log(Object.keys(config))甚至console.log(JSON.stringify(config)),您会在看到console.log时看到键或对象的状态。
通常,您会在console.log通话后找到要添加的密钥。

评论


这是错误还是功能?如果是一项功能,其背后的原因是什么?

–ESR
18年5月31日下午4:56

那如何解决呢?设置超时似乎不是一个好的解决方案。

– Sahand
18年7月13日在9:38

那么我们如何从对象访问此属性?

–罗希特·夏尔马(Rohit Sharma)
'18 Sep 1'在7:20

要澄清的是,>按钮的行为是否取决于扩展数组还是对象?

– Flimm
18-10-4在14:41

做一些测试,即使使用数组似乎也遇到了这个问题,所以我建议改用JSON.stringify。

– Flimm
18-10-4在14:47

#2 楼

我刚刚遇到了使用Mongoose从MongoDB加载的文档的问题。

在整个对象上运行console.log()时,将显示所有文档字段(存储在db中)。但是,某些单独的属性访问器将返回undefined,而其他属性访问器(包括_id)可以正常工作。

结果是,属性访问器仅适用于我的mongoose.Schema(...)定义中指定的字段,而console.log()JSON.stringify()返回存储的所有字段在数据库中。

解决方案(如果您使用的是Mongoose):确保所有数据库字段均在mongoose.Schema(...)中定义。

评论


很好地解释了这个问题,我认为Mongoose可以让我在不使用模式的情况下(在外部脚本中)查询json,但是可以防止写入。由于_id存在,并且console.log指出其他所有内容都应该可以访问,但不是,它似乎可以工作。奇怪

– bstar
16年9月2日在18:10

原来我看到了这是因为,如果给定的对象具有.toJSON()函数,则JSON.stringify()(和Node的console.log())会更改其行为。您看到的输出是.toJSON()返回的内容,而不是原始对象。猫鼬为您提供了带有.toJSON()的模型对象,该模型给出了基础的db对象。模型对象仅具有您在架构中定义的字段的访问器,但是在登录时,所有的db字段都会出现,因为您实际上看到的是.toJSON()返回的基础对象。

–拉明
2016年9月9日20:50在

猫鼬为什么不允许读取其他属性,您有什么想法?

–坎南T
18年5月22日在7:23

将CSV上载到mongodb并获取属性时,这对我很有帮助。确保您的姓名匹配。好答案,谢谢。

– 9BallOnTheSnap
19年2月25日在19:54

这次真是万分感谢。我很生气在控制台中看到它,却无法访问它。为我的架构增加了价值,我很高兴。再次感谢!

– MaxPower
19年7月11日在5:48

#3 楼

检查对象内部是否有对象数组。我有一个与JSON类似的问题:

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


我试图从'category'访问'name'键,但出现未定义的错误,因为我正在使用:

var_name = obj_array.terms.category.name


然后我意识到它有方括号,这意味着它在类别键内有一组对象,因为它可以有多个类别对象。因此,为了获得“名称”密钥,我使用了以下代码:

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


这很成功。

也许为时已晚这个答案,但是我希望有同样问题的人能像在找到解决方案之前一样找到它:)

#4 楼

我遇到过同样的问题。对我来说,解决方案是将字符串化的输出用作解析JSON的输入。这对我有用。希望它对您有用

var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);


评论


是的,它起作用了,但是为什么要这样做呢?我已经有一个JSON,为什么需要这样做?

–ja那教
16年11月29日在8:37

@dilpeshjain我不确定,但是我敢冒险说我们实际上还没有JSON(也许正在发生一个惰性加载类型的场景,目前我对此还不了解),但是通过我们所做的一切转换为JSON.stringify要求返回一个字符串(例如需要进行console.log调用以进行打印)。因为我知道至少可以得到一个字符串,所以可以立即使用该字符串创建一个JSON对象。

– Tope
17年9月2日在19:28

@jain您需要这个,因为javascript是一种可怕的语言

–user3477273
19年9月2日,下午2:46

#5 楼

您尝试访问的属性可能尚不存在。 Console.log之所以有效,是因为它会在短暂的延迟后执行,但是其余的代码则不是这样。试试这个:

var a = config.col_id_3;    //undefined

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

}, 100);


评论


我曾经使用onload方法来获取对象值。但是仍然在第一次给我未定义的信息。

–TeomanTıngır
18年11月23日在15:28

一个简单的解决方案是实现一个观察者承诺,以检查是否用setTimeout定义了所需的属性,并在该属性可用时解析+清除超时。

–赖雪
18年11月26日在4:49



哇。在我从事Web编程的15年中,我从未遇到过这种情况,也从未考虑过控制台日志的工作方式。您的回答帮助您解决了部分问题。

–凯青
3月9日18:15

#6 楼

在我的情况下,我将一个对象传递给一个promise,在该promise中,我向该对象添加了更多键/值,当promise返回了对象。

但是,看起来有些过分就我而言,诺言是在对象完全完成之前返回对象...因此,我的其余代码试图处理更新后的对象,而数据还不存在。但是像上面一样,在控制台中,我看到对象已完全更新,但是无法访问键-它们返回时未定义。直到我看到以下内容:
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*


[i]是一个小图标,当我将其悬停在它上面时,它说是Object value at left was snapshotted when logged, value below was evaluated just now。那就是当我想到我的对象在诺言完全更新它之前对其进行评估的原因。

#7 楼

我今天在这个问题上苦苦挣扎,以为我会在解决方案中留下一个答复。

我正在通过ajax来获取数据对象,就像这样:
{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

假设这个对象位于名为data的变量中。每当我引用data.i18n时,我都会得到undefined



console.log(data)显示了预期的对象

console.log(Object.keys(data))["constants","i18n"]符合预期
将i18n重命名为inter并没有进行任何更改
我什至试图切换数据以使“ i18n”成为第一个对象
移动代码以确保绝对地设置了对象并且ajax promise没有问题。

无济于事...然后在服务器端,我将数据写入了php日志,并显示了以下内容:

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

索引键中的“ i”实际上是u0456(西里尔字母i)。这在我的PHP编辑器或浏览器控制台日志中不可见。只有php日志显示了这一点。。。这是一个棘手的问题...

评论


这也是我的问题;在某些情况下,使用西里尔字母'c'代替。我通过在文件中搜索所需的字符串找到了它;没有选择可疑的人,所以告诉我有一个错误的角色,肉眼看不见。

–骑士
18-10-16在21:37

这个答案实际上帮助我找到了解决方案。我的问题是我拼错了变量名。我做了“ udpate”而不是“ update”大声笑

– Savlon
4月19日4:43

#8 楼

我的数据只是json数据字符串。 (此变量在会话中存储为json字符串)。

console.log(json_string_object)


->仅返回此字符串的表示形式,无法区分字符串或对象。

使它工作,我只需要将其转换回真实对象即可:

object = JSON.parse(json_string_object);


评论


这是唯一对我有用的答案,并且在原始问题的评论中也提到了该答案,这个答案应该更高。

–abagh0703
18-3-22的2:11

#9 楼

在2018年,Mozilla在此处的Mozilla文档中警告我们!

我引用“记录对象”:


不要使用console.log(obj);
请使用console.log(JSON.parse(JSON.stringify(obj)));

这样您确定在登录时会看到obj的值。


#10 楼

我刚刚遇到了csv-parser从MS Excel生成的CSV文件生成的对象的问题。我可以访问除第一个属性以外的所有属性-但是如果我使用console.log编写整个对象,它将显示确定。

原来,UTF-8 CSV格式插入了3个字节( ef bb bf)开头与一个不可见字符相对应-csv-parser将其作为第一个属性标头的一部分包含在内。解决方案是使用non-UTF选项重新生成CSV,这消除了不可见字符。

评论


你是英雄!感谢您发布此信息。我正在拔头发。

–乔丹·索尔特曼
19年6月13日在23:07

再次感谢您发布!救了我一晚!

–奥利弗·希克曼
19年8月26日在2:34

很棒的发现。谢谢!

– ToivoSäwén
10月9日,11:45

#11 楼

这可能对某人有帮助,因为我遇到了类似的问题,其中JSON.parse()返回一个可以在console.log()上打印的对象,但我无法访问特定字段,上述解决方案均无法解决我。就像结合使用JSON.parse()和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  


我最终使用了ExtJs Ext提供的另一个解析器解决了这个问题。 encode();

var jsonObj = Ext.decode(responseText)
console.log(jsonObj.Body) //Worked...


#12 楼

我遇到了同样的问题,上面没有解决方案对我有用,并且感觉像是此后的猜测工作。但是,将我创建代码的代码包装在一个setTimeout函数中,这对我来说很成功。

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


#13 楼

我刚刚遇到了使用Mongoose从MongoDB加载的文档的相同问题。

原来,我正在使用属性find()返回一个对象,所以我将find()更改为findOne(),并且一切正常对我来说。

解决方案(如果您使用的是Mongoose):请确保仅返回一个对象,以便可以解析其object.id,否则它将被视为一个数组,因此您需要像访问它一样那object[0].id

评论


通过帮助我清理代码,这对我有所帮助。我有一个函数在执行Mongoose查询(感谢您现在使用.findOne()),它返回一个可以在函数内部以点表示法访问的对象。我通过const test = await mongoFunction(query)在代码中进一步调用Mongoose函数,不幸的是,我的问题是返回的测试是其中包含Object [{object}]的数组,我无法以点表示法对其进行访问。它让我发疯!

– Jeremy M
7月19日12:22



#14 楼

就我而言,即使我以类似myMethod(data:MyModelClass)对象的模型格式接收数据,直到接收到的对象为字符串类型。
在console.log(data)中是y内容。
解决方案只是解析JSON(以我为例)

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


这种想法可能有用。

#15 楼

我遇到过类似的问题,希望以下解决方案能对您有所帮助。
您可以按照一些人的建议使用setTimeout函数,但是您永远都不知道浏览器需要多长时间才能定义对象。

除此之外,我建议改用setInterval函数。它将等待直到定义了对象config.col_id_3,然后触发需要您特定对象属性的下一个代码部分。

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

});


#16 楼

如果您使用的是TYPESCRIPT和/或ANGULAR,可能就是这样!

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

将响应类型设置为任何固定的问题,对于我来说,我无法访问直到我设置res为止,响应上的属性:any

看到此问题属性'_body'在类型'Response'上不存在

#17 楼

对我来说,这是一个与猫鼬有关的问题。

我遍历了从Mongo查询中获得的对象。我只需要删除:

 items = await Model.find()
 


并替换为:

 items = await Model.find().lean()
 


评论


感谢您向我介绍.lean()。我不知道它的存在,在Monggose的网站上对其进行研究后,我很高兴找到了它。感谢伟大的金块。

– Jeremy M
7月19日12:15

#18 楼

如果在使用Mongoose时出现问题,则可能会发生以下情况:
console.log(object)

返回所有内容,包括所需的密钥。
console.log(object.key)

返回未定义。
如果这种情况正在发生,这意味着该键在Mongoose模式中丢失。添加它可以解决问题。

#19 楼

我遇到了类似的问题,或者可能只是相关的问题。

对于我来说,我正在访问一个对象的属性,但是未定义。我发现问题是在创建对象的键,val时服务器端代码中出现空格。

我的方法如下...









从服务器端代码中删除创建对象的空白后,我现在可以按以下方式访问属性...



这可能不是主题问题的问题,但对我而言,可能是这样为了其他人。希望对您有所帮助。

#20 楼

首先检查如下类型:
console.log(typeof config);

如果上面的命令打印对象,那么使用括号表示法非常容易。如果要动态搜索属性的值,括号表示法会非常有用。
执行以下命令:
console.log(config[col_id_3]);

如果是字符串,则需要首先在对象中进行解析。为此,您需要执行以下命令:
var object = JSON.parse(config);

,然后使用括号表示法访问属性,如下所示:
console.log(object[col_id_3]);


#21 楼

我遇到了这样的问题,发现解决方案与Underscore.js有关。我最初的日志记录没有任何意义:

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

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

console.log(obj.code);

> undefined


我通过查看对象的键找到了解决方案:

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

> ["_wrapped","_chain"]


这使我意识到obj实际上是一个围绕对象的Underscore.js包装器,并且最初的调试对我来说是说谎。

#22 楼

我有类似的问题(在开发SugarCRM时),我从以下地方开始:

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


问题在fetch()中,它是异步调用,所以我不得不将代码重写为:

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


#23 楼

万一这对某人有帮助,我遇到了类似的问题,这是因为某人在我正在使用的对象中为.toJSON创建了覆盖。因此该对象类似于:

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


但是.toJSON()是:

toJSON() {
  return this.foo
}


所以当我叫JSON.stringify(myObject),它返回了“ {” bar”:“ Hello”,“ baz”:“ World”}”。但是,Object.keys(myObject)显示了“ foo”。

评论


toJson()这就是这里没有人提到的重点。我不知道为什么这个答案会被否决,因为这是一种创建具有不同于json或控制台表示形式的值的对象的方法。我不知道它的存在,直到我在另一个答案中发现它为止,我认为应该改掉这个答案,因为这是考虑此类问题的重点。

–Rick Love
2月26日14:59

考虑到答案的准确度为0分,我认为有人刚刚对所有内容进行了投票。

–emote_control
2月27日15:35

#24 楼

我今天也遇到了同样的问题。在我的情况下,键是嵌套的,即key1.key2。
我使用split()拆分了键,然后使用了方括号表示法,这对我确实有用。

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


我拆分了键并像这样使用它,data [key1] [key2]帮了我大忙。

#25 楼

我今天有同样的问题。问题是由uglify-js引起的。执行完相同的非丑化代码后,问题解决了。从uglify-js中删除
--mangle-props


就足以使工作的uglified代码。

也许,最佳实践是对uglify-js的正则表达式规则进行修饰的属性使用一些前缀。

以下是来源:

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


这是丑陋的样子:

var n = JSON.parse( t);
...
this._ = parseInt(n.index), this.g = parseInt(n.total), this.D = parseInt(n.C)


#26 楼

没有JSON字符串化/解析对我有用。

formValues.myKey:               undefined
formValues.myKey with timeout:  content


我想要formValues.myKey的值,窍门是setTimeout 0,如下面的示例所示。希望对您有所帮助。

console.log('formValues.myKey: ',formValues.myKey);
setTimeout( () => { 
  console.log('formValues.myKey with timeout: ', formValues.myKey);
}, 0 );


#27 楼

我也刚刚遇到了这个问题,长话短说,我的API返回的是字符串类型而不是JSON。因此,当您将其打印到日志时,它看起来完全一样,但是每当我尝试访问属性时,它都会给我带来未定义的错误。

API代码:

     var response = JsonConvert.DeserializeObject<StatusResult>(string Of object);
     return Json(response);


以前我只是返回:

return Json(string Of object);


#28 楼

今天我在React中遇到了类似的问题。最终意识到问题是由尚未设置的状态引起的。我正在调用user.user.name,尽管它已出现在控制台中,但是直到我包括检查user.user的设置并随后调用user.user.name为止,我似乎无法在组件中访问它。

#29 楼

检查您是否在控制台中应用了任何过滤器。我在chrome控制台中碰巧了。

#30 楼

我也遇到了一个令人沮丧的问题,我尝试了setTimeout()以及JSON.stringifyJSON.parse解决方案,即使我知道它不起作用,因为我认为它们主要是与JSON或Promise相关的问题,可以肯定地说,它不起作用。但就我而言,我没有立即注意到这是一个愚蠢的错误。我实际上是使用不同的大小写来访问属性名称。就像这样:



 const wrongPropName = "SomeProperty"; // upper case "S"
const correctPropName = "someProperty"; // lower case "s"
const object = { someProperty: "hello world!" };

console.log('Accessing "SomeProperty":', object[wrongPropName]);
console.log('Accessing "someProperty":', object[correctPropName]) 




我花了一段时间才注意到,因为在我的情况下,属性名称可以全部为小写,也可以为大小写混合。原来,我的Web应用程序中的一个函数使我的属性名称一团糟(在生成的键名next旁边有一个.toLowerCase())。