无法访问对象属性,即使它存在.返回undefined

Bri*_*ger 298 javascript console.log

这令我困惑.我不知道怎么解释这个,但这是我的调试代码的样子.在它下面,您可以看到这两个日志的输出.第一个清楚地显示了我正在尝试访问的属性的完整JavaScript对象,但下一行代码我无法使用config.col_id_3访问它(请参阅屏幕截图中的"undefined"?).有谁能解释一下?我也可以访问除field_id_4之外的所有其他属性.

console.log(config);
console.log(config.col_id_3);
Run Code Online (Sandbox Code Playgroud)

这就是这些console.log()在Console中打印的内容

控制台输出

Mat*_*att 263

输出console.log(anObject)是误导性的; 只有>在控制台中展开时,才会解析显示的对象的状态.当你成为对象时,它不是对象的状态console.log.

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

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

  • 这种行为是错误还是功能?如果它是一个功能,背后的原因是什么? (8认同)
  • 来自 MDN:“不要使用 `console.log(obj)`,而使用 `console.log(JSON.parse(JSON.stringify(obj)))`。这样您就可以确定看到了 `obj 的值` 在您记录它的那一刻。否则,许多浏览器提供的实时视图会随着值的变化而不断更新。这可能不是您想要的。” https://developer.mozilla.org/en-US/docs/Web/API/Console/log (6认同)
  • 那么如何解决这个问题呢?设置超时似乎不是一个好的解决方案。 (5认同)
  • 那么如何从对象访问此属性? (5认同)

ram*_*min 48

我刚刚使用Mongoose从MongoDB加载了一个文档.

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

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

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

  • 事实证明我看到了这一点,因为`JSON.stringify()`(和Node的`console.log()`)如果给定的对象具有`.toJSON()`函数,则会改变它们的行为.您看到的输出是`.toJSON()`返回的内容,而不是原始对象.Mongoose为您提供了一个带有.toJSON()`的模型对象,它提供了底层的db对象.模型对象只有您在模式中定义的字段的访问器,但是当您记录它时会显示所有数据库字段,因为您实际上看到了`.toJSON()`返回的基础对象. (6认同)
  • 对这个问题的很好解释,我认为 Mongoose 会让我在没有模式的情况下查询 json(在外部脚本中),但会阻止写入。它似乎可以工作,因为 _id 存在,并且 console.log 说其他所有内容都应该可以访问,但事实并非如此。奇怪。 (2认同)
  • 这次真是万分感谢。我在控制台中看到它却无法访问它,简直要疯了。为我的架构添加了价值,我很高兴可以开始。再次感谢! (2认同)
  • 如果您想访问架构中未定义的属性,您还可以使用“toObject()”方法将返回的文档转换为 JavaScript 对象。请参阅 https://mongoosejs.com/docs/guide.html#toObject (2认同)

Asa*_*pez 25

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

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

我试图从'category'访问'name'键,我得到了未定义的错误,因为我使用的是:

var_name = obj_array.terms.category.name
Run Code Online (Sandbox Code Playgroud)

然后我意识到它有方括号,这意味着它在类别键中有一个对象数组,因为它可以有多个类别对象.所以,为了获得'name'键,我使用了这个:

var_name = obj_array.terms.category[0].name
Run Code Online (Sandbox Code Playgroud)

这就是诀窍.

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


Lai*_*Xue 21

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

var a = config.col_id_3;    //undefined

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

}, 100);
Run Code Online (Sandbox Code Playgroud)

  • 我曾经使用onload方法来获取我的对象值。但第一次仍然给我未定义..这种语言让我一天天死去 (3认同)

Top*_*ope 20

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

var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);
Run Code Online (Sandbox Code Playgroud)

  • 是的,它有效,但为什么需要这样做?我已经有一个 JSON,为什么我需要这样做? (2认同)
  • @jain您需要这个,因为javascript是一种可怕的语言 (2认同)

Jet*_*tte 9

我今天在这个问题上挣扎,并且认为我会用我的解决方案回复.

我是通过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承诺没有问题.

什么都没有帮助...然后在服务器端我将数据写入php日志,它显示了这个:

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

索引键中的"i"实际上是u0456(西里尔文i).这在我的php编辑器或浏览器控制台日志中不可见.只有php日志显示这个...这是一个棘手的...


rol*_*ger 9

在我的情况下,我将一个对象传递给一个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*
Run Code Online (Sandbox Code Playgroud)

[i]是一个小图标,当我在它上面盘旋它说Object value at left was snapshotted when logged, value below was evaluated just now.多数民众赞成在我发现我的对象在承诺完全更新之前被评估的时候.


rem*_*dej 9

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

我正在循环访问从 Mongo 查询中获得的对象。我只需要删除:

items = await Model.find()
Run Code Online (Sandbox Code Playgroud)

并将其替换为:

items = await Model.find().lean()
Run Code Online (Sandbox Code Playgroud)


mak*_*asi 7

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

console.log(json_string_object)
Run Code Online (Sandbox Code Playgroud)

- >只返回此字符串的表示形式,无论是字符串还是对象,都无法区分.

所以为了使它工作我只需要将它转换回真实对象:

object = JSON.parse(json_string_object);
Run Code Online (Sandbox Code Playgroud)


小智 6

我刚刚在 csv-parser 从 MS Excel 生成的 CSV 文件生成的对象中遇到了这个问题。我能够访问除第一个属性之外的所有属性 - 但如果我使用 console.log 编写整个对象,它会显示正常。

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

  • 你是英雄!感谢您发布此内容。我正在拔头发。 (2认同)

MTZ*_*MTZ 5

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

我引用“记录对象”

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

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


Jul*_* E. 5

如果这是在使用Mongoose时发生的问题,则可能会发生以下情况:

console.log(object)
Run Code Online (Sandbox Code Playgroud)

返回所有内容,包括所需的密钥。

console.log(object.key)
Run Code Online (Sandbox Code Playgroud)

返回未定义。

如果发生这种情况,则意味着 Mongoose Schema 中缺少密钥。添加它可以解决问题。