即使存在,也不能访问对象属性。 返回undefined

这让我感到困惑。 我不知道如何解释这个,但这里是我的debugging代码看起来像。 在它下面你可以看到这两个日志的输出。 第一个清楚地显示完整的JS对象与我想要访问的属性,但是下一行代码我无法通过config.col_id_3访问它(请参阅截图中的“undefined”?)。 任何人都可以解释吗? 我可以访问除field_id_4以外的其他任何属性。

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

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

控制台输出

console.log(anObject)的输出具有误导性。 当您在控制台中展开>时,只显示所显示对象的状态。 当你console.log的对象不是对象的状态。

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

您将(通常) 您的console.log调用之后发现键被添加。

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

这就是诀窍。

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

我刚才有一个使用Mongoose从MongoDB加载文档的问题。

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

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

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

您尝试访问的媒体资源可能尚不存在。 Console.log的工作原理是因为它稍微延迟后执行,但是对于其他代码,情况并非如此。 尝试这个:

 var a = config.col_id_3; //undefined setTimeout(function() { var a = config.col_id_3; //voila! }, 100); 

我遇到过同样的问题。 我的解决scheme是使用string输出作为parsingJSON的input。 这对我工作。 希望对你有用

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

我今天在这个问题上苦苦挣扎,以为我会给我的答案留下一个答复。

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

假设这个对象位于一个名为data的variables中。 每当我引用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日志显示这…这是一个棘手的一个…

在我的情况下,我传递一个对象的承诺,在承诺我添加更多的键/值的对象,当它完成承诺返回的对象。

然而,稍微看了一下,承诺是在完全完成之前返回对象…因此,我的代码的其余部分试图处理更新的对象,数据还没有。 但是像上面那样,在控制台中,我看到对象完全更新,但无法访问键 – 他们回来了未定义。 直到我看到这个:

 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]是一个小图标,当我将它hover在它上面时,它表示Object value at left was snapshotted when logged, value below was evaluated just now 。 那就是当我发现我的目标是在诺言完全更新之前进行评估的。

我的数据只是json数据string。 (这个variables被存储为会话中的jsonstring)。

 console.log(json_string_object) 

– >只返回这个string的表示forms,无论是string还是对象都没有办法区分。

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

 object = JSON.parse(json_string_object); 

尝试使用config [0]或config [0] .col_id_3

我也有这个问题,我能够看到一个对象,logging它,但没有从代码访问它。 我试着在它前面添加一个[0],并解决了我的问题。 我可以访问所有的属性。

我不会在这里发帖,因为没有足够的post发表评论的愤怒,但下面发布这个人是正确的。 尝试访问对象时,ajax调用未完成。 我甚至会更进一步,使用500而不是100超时,只是为了确保。

 var a = config.col_id_3; //undefined setTimeout(function() { var a = config.col_id_3; //voila! }, 100); 

我有同样的问题,上面没有解决scheme为我工作,这种感觉就像之后的猜测工作。 然而,包装我的代码,在setTimeout函数创build对象做了我的伎俩。

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

我有类似的问题,也许只是相关的。

对于我的情况,我正在访问一个对象的属性,但一个是未定义的。 我发现问题是在创build对象的键val时服务器端代码中的空白。

我的方法如下…

创造我的对象...注意“word”中的空格

我从REST API获取响应

JavaScript代码来记录值

从控制台记录结果

删除创build对象的服务器端代码的空白后,我现在可以访问属性如下…

删除空格后结果

这可能不是主题问题的问题,而是针对我的情况,对其他人可能如此。 希望它有帮助。

我有这样的问题,并发现解决scheme是与Underscore.js。 我最初的日志没有意义:

 console.log(JSON.stringify(obj, null, 2)); > { > "code": "foo" > } console.log(obj.code); > undefined 

我还通过查看对象的键来find解决scheme:

 console.log(JSON.stringify(Object.keys(obj))); > ["_wrapped","_chain"] 

这导致我意识到obj实际上是一个对象周围的Underscore.js包装,并且最初的debugging正在对我说谎。

 config = JSON.parse(config); 

我也一样,数据是一个文本,而不是我所期待的JSON。

我有类似的问题(为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() ,它的asynchronous调用,所以我不得不重写我的代码:

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

这里有很棒的build议 我会添加,因为有人可能会觉得有用。

非常了解caching,在浏览器或远程。

我正在努力,因为我在网上开发,并实施了一个简单的策略。

  1. 我把我的js脚本的浏览器负载反caching。 引号:“追加一个查询string”v = 1“到所有的.css和.js文件,以防止caching。
  2. 我在放置一个额外的控制台日志,在尝试新的请求之前修改:console.log(“”); 如果我没有看到这个新的日志在控制台中,我知道我有一个caching问题的地方。

一旦我得到了正确的语法,我已经删除了前面提到的延迟,一切都很好。 对我来说,我不得不使用“JSON.stringify(”

为了防止这种情况对某人有用,我遇到了类似的问题,这是因为有人在我正在使用的对象中为.toJSON创build了一个覆盖。 所以对象是这样的:

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

但是.JSON()是:

 toJSON() { return this.foo } 

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

优秀的build议。 我刚刚有类似的问题,所以我的两分钱。 解决问题的一件事是在我的请求选项中添加了“json:true”。 (这当然取决于你使用的库,但是一般的前提是一样的 – 指定你期望得到的内容格式。)

我今天面对同样的问题。 在我的情况下,键是嵌套的,即key1.key2。 我使用split()分割键,然后使用方括号表示法,这对我来说是有用的。

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

我分裂的钥匙,并像这样使用,为我做了工作的数据[key1] [key2]。

如果你使用TYPESCRIPT和/或ANGULAR,可能是这个!

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

设置响应types为任何固定的这个问题,我无法访问响应属性,直到我设置res:任何

看到这个问题属性'_body'不存在types'响应'

我在使用一个调用ajax的函数时遇到了同样的问题。 在我的情况下,我无法从服务器获取有效的错误代码。 这是function:

 function getListItem(listItemUri){ return jQuery.ajax({ url: listItemUri, type: "Get", headers: { "accept": "application/json;odata=verbose" } }); } 

下面的代码是不正确的,并将显示在控制台中的对象,但尝试访问它时将是未定义的。

 var list = getListItem(uri); var failed = list.fail(onerror); console.log(failed); //displays object which included a status console.log(obj.status); //but when trying to retrieve the status message it was undefined 

下面的代码允许我访问对象中的值。 关键在于使用list.fail作为函数,而不是将其分配给variables。

 var list = getListItem(uri); list.fail(function(obj){ console.log(obj); //displays object console.log(obj.status); //the object is now defined and I am able to see the error code returned by the server });