即使对象属性显示在控制台日志中,也无法访问


329

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

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

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

控制台输出


6
你可以尝试console.log(JSON.stringify(config));ANS份额O / P
阿伦P约翰尼拉

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

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

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

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

Answers:


296

的输出具有console.log(anObject)误导性;仅当您>在控制台中展开时,才会解析所显示对象的状态。当您创建对象时,它不是对象的状态console.log

相反,尝试console.log(Object.keys(config))或甚console.log(JSON.stringify(config))至,您将在调用时看到键或对象的状态console.log

你会(通常)找到被添加键您的console.log来电。


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

2
那如何解决呢?设置超时似乎不是一个好的解决方案。
萨汉德'18

9
那么我们如何从对象访问此属性?
Rohit Sharma '18

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

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

62

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

console.log()整个对象上运行时,将显示所有文档字段(存储在数据库中)。但是undefined,当其他人(包括_id)工作正常。

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

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


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

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

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

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

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

27

检查对象内部是否有对象数组。JSON也有类似的问题:

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

我尝试从“类别”访问“名称”键,但出现未定义的错误,因为我正在使用:

var_name = obj_array.terms.category.name

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

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

这就是窍门。

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


23

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

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

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

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

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

22

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

var a = config.col_id_3;    //undefined

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

}, 100);

1
我用的onload方法来让我的对象values.But仍然给我不确定在第一时间..这种语言让我死的一天一天
泰奥曼Tıngır

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

哇。在我从事Web编程的15年中,我从未遇到过这种情况,也从未考虑过控制台日志的工作方式。您的回答有助于清除其中的一些内容。
开清

12

在我的情况下,我将一个对象传递给一个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。那就是当我想到我的对象在诺言完全更新之前就已经进行了评估。


10

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

我通过ajax提取数据对象,如下所示: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

假设此对象位于名为data的变量中。每当我引用data.i18n我就知道了undefined

  1. console.log(data) 按预期显示了对象
  2. console.log(Object.keys(data)) 说过 ["constants","i18n"]如预期
  3. i18n重命名为inter并没有任何改变
  4. 我什至尝试切换数据以使“ i18n”成为第一个对象
  5. 移动代码以完全确保对象已完全设置并且ajax promise没有问题。

没有任何帮助...然后在服务器端,我将数据写入了php日志,并显示了这一点:

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

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


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

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

8

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

console.log(json_string_object)

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

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

object = JSON.parse(json_string_object);

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

5

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

我引用“记录对象”

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

这样,您可以确定在记录obj时会看到它的值。


4

这可能对某人有帮助,因为我遇到了类似的问题,其中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.decode()来解决了这个问题。

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

2

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

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

思想可能有用。


2

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

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


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

再次感谢您发布!救了我一晚!
奥利弗·希克曼

2

我遇到过类似的问题,希望以下解决方案能对您有所帮助。
您可以使用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

});


1

我遇到了同样的问题,上面没有解决方案对我有用,此后感觉就像是猜测。但是,将我创建代码的代码包装到一个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
});

1

我有一个类似的问题,或者可能只是相关的。

就我而言,我正在访问一个对象的属性,但是未定义。我发现问题是在创建对象的键,值时服务器端代码中的空格。

我的方法如下...

创建我的对象...请注意“单词”中的空白

我从我的REST API得到的响应

JavaScript代码记录值

从控制台记录结果

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

删除空格后的结果

这可能不是主题问题的问题,而是我的情况,而其他问题也可能是问题。希望能帮助到你。


1

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

原来,我使用该属性find()仅返回一个对象,因此我更改 find()findOne()并且一切对我都有效。

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


1

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

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

items = await Model.find()

并替换为:

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

0

我遇到了这样的问题,发现解决方案与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包装器,并且最初的调试对我来说是说谎的。


0

我有类似的问题(在为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);
    }
});

0

万一这对某人有帮助,我遇到了类似的问题,这是因为某人在我正在使用的对象中为.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

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

0

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

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

我拆分了键并像这样使用它,即data [key1] [key2],它为我完成了工作。


0

我今天有同样的问题。问题是由uglify-js引起的。执行完相同的未丑化代码后,问题解决了。去除

--mangle-props

来自uglify-js的代码足以包含有效的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)

0

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

0

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

API代码:

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

以前我只是返回:

return Json(string Of object);

0

今天我在React中遇到了类似的问题。最终意识到问题是由尚未设置的状态引起的。我正在打电话user.user.name,尽管它已出现在控制台中,但直到我包含检查user.user设置是否成立然后再打电话的检查,我似乎无法在组件中访问它user.user.name

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.