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

IT技术 javascript console.log
2021-01-16 17:40:51

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

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

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

控制台输出

6个回答

的输出具有console.log(anObject)误导性;显示对象的状态仅在您通过单击 展开控制台中显示的对象树时解析>当你得到对象时,不是对象的状态console.log

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

您(通常)会console.log致电发现正在添加密钥

那么如何解决这个问题呢?设置超时似乎不是一个好的解决方案。
2021-03-14 17:40:51
这可能是由于异步设置属性造成的。
2021-03-15 17:40:51
澄清一下,>按钮的行为是否取决于是扩展数组还是对象?
2021-03-31 17:40:51
那么我们如何从对象访问这个属性呢?
2021-04-03 17:40:51
这种行为是错误还是功能?如果它是一个功能,它背后的原因是什么?
2021-04-09 17:40:51

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

console.log()整个对象上运行时,所有文档字段(存储在数据库中)都会显示出来。然而undefined,当其他属性访问器(包括_id)工作正常时,某些单独的属性访问器会返回

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

解决方案(如果您使用的是 Mongoose):确保您的所有 db 字段都在mongoose.Schema(...).

在将 CSV 上传到 mongodb 并获取属性时,这对我很有帮助。确保你的名字匹配。很好的答案谢谢。
2021-03-10 17:40:51
为什么mongoose不允许读取其他属性你有什么想法吗?
2021-03-12 17:40:51
这次真是万分感谢。在控制台中看到它而无法访问它,我快疯了。为我的架构添加了value,我很高兴。再次感谢!
2021-03-14 17:40:51
这个问题的很好解释,我认为 Mongoose 会让我在没有模式的情况下查询 json(在外部脚本中),但会阻止写入。它似乎可以工作,因为 _id 存在,并且 console.log 说其他所有内容都应该可以访问,但事实并非如此。奇怪。
2021-03-16 17:40:51
结果我看到了这一点,因为JSON.stringify()(和 Node 的console.log())如果给定的对象具有.toJSON()函数,则会改变它们的行为您看到的输出是.toJSON()返回的内容,而不是原始对象。Mongoose 为您提供了一个模型对象,该对象.toJSON()提供了底层 db 对象。模型对象只有您在模式中定义的字段的访问器,但是当您记录它时所有 db 字段都会出现,因为您实际上看到的是由.toJSON().
2021-03-20 17:40:51

检查对象内部是否有对象数组。我对 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

这就是诀窍。

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

我遇到过同样的问题。我的解决方案是使用字符串化的输出作为解析 JSON 的输入。这对我有用。希望对你有用

var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);
是的,它有效,但为什么需要这样做?我已经有一个 JSON,为什么我需要这样做?
2021-03-18 17:40:51
@jain 你需要这个,因为 javascript 是一种可怕的语言
2021-03-28 17:40:51
@dilpeshjain 我不太确定,但我敢说我们实际上还没有 JSON(也许正在进行延迟加载类型的场景,我目前对此还不够了解),但是传递我们所做的任何事情进入 JSON.stringify 需要返回一个字符串(如 console.log 调用需要打印)。因为我知道我至少可以得到一个字符串,然后我可以立即使用该字符串创建一个 JSON 对象。
2021-04-01 17:40:51

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

var a = config.col_id_3;    //undefined

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

}, 100);
哇。在我 15 年的 Web 编程生涯中,我从未遇到过这种情况,也从未考虑过控制台日志的工作原理。您的回答有助于澄清其中的一些问题。
2021-03-23 17:40:51
我曾经使用onload方法来获取我的对象值。但第一次仍然给我未定义..这种语言让我一天天死去
2021-03-28 17:40:51
一个简单的解决方案是实现一个观察者Promise,检查是否使用 setTimeout 定义了所需的属性,并在属性可用时解决 + 清除超时。
2021-03-31 17:40:51