在下面,您可以看到这两个日志的输出。第一个清楚地显示了我要访问的具有属性的完整对象,但是在下一行代码中,我无法使用它config.col_id_3
(请参见屏幕快照中的“未定义”?)。谁能解释一下?除此以外field_id_4
,我还可以访问其他所有属性。
console.log(config);
console.log(config.col_id_3);
这是这些行在控制台中打印的内容
JSON.parse(obj)
在下面,您可以看到这两个日志的输出。第一个清楚地显示了我要访问的具有属性的完整对象,但是在下一行代码中,我无法使用它config.col_id_3
(请参见屏幕快照中的“未定义”?)。谁能解释一下?除此以外field_id_4
,我还可以访问其他所有属性。
console.log(config);
console.log(config.col_id_3);
这是这些行在控制台中打印的内容
JSON.parse(obj)
Answers:
的输出具有console.log(anObject)
误导性;仅当您>
在控制台中展开时,才会解析所显示对象的状态。当您创建对象时,它不是对象的状态console.log
。
相反,尝试console.log(Object.keys(config))
或甚console.log(JSON.stringify(config))
至,您将在调用时看到键或对象的状态console.log
。
你会(通常)找到被添加键后您的console.log
来电。
>
按钮的行为是否取决于扩展数组还是对象?
我刚刚遇到了使用Mongoose从MongoDB加载的文档的问题。
在console.log()
整个对象上运行时,将显示所有文档字段(存储在数据库中)。但是undefined
,当其他人(包括_id
)工作正常。
原来,属性访问器仅适用于我mongoose.Schema(...)
定义中指定的字段,而console.log()
和JSON.stringify()
存储在数据库中的所有领域的回报。
解决方案(如果您使用的是Mongoose):确保在中定义了所有数据库字段mongoose.Schema(...)
。
JSON.stringify()
(和Node的console.log()
)如果给定的对象具有.toJSON()
功能,则会更改其行为。您看到的输出是.toJSON()
返回的内容,而不是原始对象。猫鼬给您的模型对象.toJSON()
提供了基础数据库对象。模型对象仅具有您在模式中定义的字段的访问器,但是在登录时,所有db字段都会出现,因为您实际上正在看到所返回的基础对象.toJSON()
。
检查对象内部是否有对象数组。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);
您尝试访问的属性可能尚不存在。Console.log之所以有效,是因为它会在短暂的延迟后执行,但其余代码并非如此。尝试这个:
var a = config.col_id_3; //undefined
setTimeout(function()
{
var a = config.col_id_3; //voila!
}, 100);
在我的情况下,我将一个对象传递给一个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
。那就是当我想到我的对象在诺言完全更新之前就已经进行了评估。
我今天在这个问题上苦苦挣扎,以为我会在解决方案中留下一个答复。
我通过ajax提取数据对象,如下所示:
{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
假设此对象位于名为data的变量中。每当我引用data.i18n
我就知道了undefined
。
console.log(data)
按预期显示了对象console.log(Object.keys(data))
说过 ["constants","i18n"]
如预期没有任何帮助...然后在服务器端,我将数据写入了php日志,并显示了这一点:
{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}
索引键中的“ i”实际上是u0456(西里尔字母i)。这在我的PHP编辑器或浏览器控制台日志中不可见。只有php日志显示了这一点……那是一个棘手的问题……
在2018年,Mozilla在此处的Mozilla文档中警告我们!
我引用“记录对象”:
不要用
console.log(obj);
, 用console.log(JSON.parse(JSON.stringify(obj)));
。这样,您可以确定在记录obj时会看到它的值。
这可能对某人有帮助,因为我遇到了类似的问题,其中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...
我遇到过类似的问题,希望以下解决方案能对您有所帮助。
您可以使用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
});
如果您正在使用TYPESCRIPT
and / or ANGULAR
,可能就是这个!
.then((res: any) => res.json())
将响应类型设置为对我而言已解决的任何问题,直到我设置了响应,我才能访问响应的属性 res:any
看到此问题类型“响应”上不存在属性“ _body”
使用Mongoose从MongoDB加载的文档遇到了同样的问题。
原来,我使用该属性find()
仅返回一个对象,因此我更改 find()
为findOne()
并且一切对我都有效。
解决方案(如果您使用的是Mongoose):确保仅返回一个对象,以便可以对其进行解析object.id
,否则它将被视为一个数组,因此需要像这样对它进行访问object[0].id
。
我遇到了这样的问题,发现解决方案与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包装器,并且最初的调试对我来说是说谎的。
我有类似的问题(在为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);
}
});
万一这对某人有帮助,我遇到了类似的问题,这是因为某人在我正在使用的对象中为.toJSON创建了覆盖。所以对象是这样的:
{
foo: {
bar: "Hello"
baz: "World"
}
}
但是.toJSON()是:
toJSON() {
return this.foo
}
因此,当我调用JSON.stringify(myObject)时,它返回了“ {” bar“:” Hello“,” baz“:” World“}”。但是,Object.keys(myObject)显示了“ foo”。
toJson()
这是这里没有人提到的重点。我不知道为什么这个答案被否决了,因为这是一种创建具有不同于json或控制台表示形式的值的对象的方法。我不知道它的存在,直到我在另一个答案中发现它为止,我认为应该改掉这个答案,因为这是考虑此类问题的要点。
我今天有同样的问题。问题是由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)
没有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 );
我也刚刚遇到了这个问题,长话短说,我的API返回的是字符串类型而不是JSON。因此,当您将其打印到日志时,它看起来完全一样,但是,每当我尝试访问属性时,它都会给我带来未定义的错误。
API代码:
var response = JsonConvert.DeserializeObject<StatusResult>(string Of object);
return Json(response);
以前我只是返回:
return Json(string Of object);
console.log(JSON.stringify(config));
ANS份额O / P