即使存在,也不能访问对象属性。 返回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
。
-
console.log(data)
按预期显示对象 -
console.log(Object.keys(data))
如预期的那样表示["constants","i18n"]
- 将i18n重命名为inter没有任何改变
- 我甚至试图切换数据以使“i18n”成为第一个对象
- 移动代码以确保对象完全设置,并且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时服务器端代码中的空白。
我的方法如下…
删除创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,在浏览器或远程。
我正在努力,因为我在网上开发,并实施了一个简单的策略。
- 我把我的js脚本的浏览器负载反caching。 引号:“追加一个查询string”v = 1“到所有的.css和.js文件,以防止caching。
- 我在放置一个额外的控制台日志,在尝试新的请求之前修改: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 });