令我感到困惑。我不知道怎么解释这个,但这是我的调试代码的样子。在它下面,您可以看到这两个日志的输出。第一个清楚地显示了我正在尝试访问的属性的完整JavaScript对象,但下一行代码我无法使用config.col_id_3访问它(请参阅屏幕截图中的“undefined”?)。有谁能解释一下?我也可以访问除field_id_4之外的所有其他属性。
console.log(config);
console.log(config.col_id_3);
这是console.log()在控制台中打印的内容
答案 0 :(得分:248)
console.log(anObject)
的输出具有误导性;只有在控制台中展开>
时,才会解析显示的对象的状态。 console.log
对象时,不对象的状态。
相反,请尝试console.log(Object.keys(config))
,甚至是console.log(JSON.stringify(config))
,您会在调用console.log
时看到关键字或对象的状态。
您(通常)会在<{em> console.log
来电后找到正在添加的密钥。
答案 1 :(得分:39)
我刚刚使用Mongoose从MongoDB加载了一个文档。
在整个对象上运行override func viewDidAppear(animated: Bool) {
view.userInteractionEnabled = true
let pinchGesture:UIPinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: "pinchGesture")
view.addGestureRecognizer(pinchGesture)
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
view.addGestureRecognizer(tap)
}
func dismissKeyboard() {
view.endEditing(true)
}
func pinchGesture(){
self.performSegueWithIdentifier("trick1Segue", sender: self)
}
时,将显示所有文档字段(存储在数据库中)。但是,当其他(包括console.log()
)工作正常时,某些单独的属性访问器将返回undefined
。
原来,属性访问器仅适用于我的_id
定义中指定的那些字段,而mongoose.Schema(...)
和console.log()
则返回存储在db中的所有字段。
解决方案(如果您使用的是Mongoose):确保所有数据库字段都在JSON.stringify()
中定义。
答案 2 :(得分:22)
检查对象内部是否有一组对象。我有一个与JSON类似的问题:
"terms": {
"category": [
{
"ID": 4,
"name": "Cirugia",
"slug": "cirugia",
"description": "",
"taxonomy": "category",
"parent": null,
"count": 68,
"link": "http://distritocuatro.mx/enarm/category/cirugia/"
}
]
}
我试图访问&#39;名称&#39;来自&#39;类别的关键&#39;我得到了 undefined 错误,因为我正在使用:
var_name = obj_array.terms.category.name
然后我意识到它有方括号,这意味着它在类别键中有一个对象数组,因为它可以有多个类别对象。所以,为了得到这个名字&#39;关键我用过这个:
var_name = obj_array.terms.category[0].name
这就是诀窍。
对于这个答案来说可能为时已晚,但我希望有同样问题的人会在找到解决方案之前找到这个:)
答案 3 :(得分:19)
您尝试访问的媒体资源可能尚不存在。 Console.log之所以有效,是因为它在一小段延迟后执行,但其余代码则不然。试试这个:
var a = config.col_id_3; //undefined
setTimeout(function()
{
var a = config.col_id_3; //voila!
}, 100);
答案 4 :(得分:16)
我有同样的问题。我的解决方案是使用字符串化输出作为解析JSON的输入。这对我有用。希望它对你有用
var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);
答案 5 :(得分: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*
[i]是一个小图标,当我在它上面盘旋时它说Object value at left was snapshotted when logged, value below was evaluated just now
。多数民众赞成在我承诺在承诺完全更新之前我的对象正在被评估。
答案 6 :(得分:8)
我今天在这个问题上挣扎,并且认为我会用我的解决方案回复。
我是通过ajax获取数据对象,如下所示:
int main(void){
...
}
让我们说这个对象在一个名为data的变量中。每当我引用{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
时,我都会data.i18n
。
undefined
按预期显示对象console.log(data)
按预期console.log(Object.keys(data))
说没有任何帮助...然后在服务器端我将数据写入php日志,它显示了这一点:
["constants","i18n"]
&#34; i&#34;在索引键中实际上是一个u0456(西里尔文i)。这在我的php编辑器或浏览器控制台日志中不可见。只有php日志显示了这个...这是一个棘手的...
答案 7 :(得分:6)
我的数据只是json数据字符串。 (此变量在会话中存储为json字符串)。
console.log(json_string_object)
- &GT;只返回此字符串的表示形式,无论是字符串还是对象,都无法区分。
因此,为了使其工作,我只需要将其转换回真实对象:
object = JSON.parse(json_string_object);
答案 8 :(得分:3)
这可能对某人有所帮助,因为我遇到了一个类似的问题,其中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...
答案 9 :(得分:2)
如果您使用TYPESCRIPT
和/或ANGULAR
,则可能就是这样!
.then((res: any) => res.json())
将响应类型设置为任何为我解决此问题,我无法访问响应中的属性,直到我设置 res:any
答案 10 :(得分:2)
2018年,Mozilla在Mozilla Docs here警告我们!
我引用 &#34;记录对象&#34; :
请勿使用
console.log(obj);
, 使用console.log(JSON.parse(JSON.stringify(obj)));
。这样你就可以确定你现在正在看到obj的价值 你记录它。
答案 11 :(得分:2)
如果在使用猫鼬时出现此问题,则可能会发生以下情况:
console.log(object)
返回所有内容,包括所需的键。
console.log(object.key)
返回未定义。
如果发生这种情况,则意味着该键在Mongoose模式中丢失。添加它可以解决问题。
答案 12 :(得分:2)
我遇到过类似的问题,希望以下解决方案对某人有所帮助。
您可以按照某些人的建议使用 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
});
答案 13 :(得分:1)
我有类似的问题,或者只是相关的问题。
对于我的情况,我正在访问一个对象的属性,但一个未定义。我发现问题是服务器端代码中的空白区域,同时创建对象的密钥,val。
我的方法如下......
从创建对象的服务器端代码中删除空格后,我现在可以访问该属性,如下所示...
这可能不是主题问题的问题,而是针对我的情况,对于其他人可能也是如此。希望它有所帮助。
答案 14 :(得分:1)
我遇到了同样的问题,上面没有任何解决方案对我有用,而且之后有点像猜测工作。但是,在setTimeout
函数中创建对象的代码包装对我来说是个窍门。
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
});
答案 15 :(得分:1)
首先检查如下类型:
console.log(typeof config);
如果上面的命令打印对象,则只需使用方括号符号即可。如果您要动态搜索属性的值,则括号符号可能会非常有用。
执行以下命令:
console.log(config[col_id_3]);
如果是字符串,则需要首先在对象中解析。为此,您需要执行以下命令:
var object = JSON.parse(config);
然后使用括号表示法访问属性,如下所示:
console.log(object[col_id_3]);
答案 16 :(得分:1)
我使用Mongoose从MongoDB加载的文档遇到了同样的问题。
原来我使用属性find()
只返回一个对象,所以我将find()
更改为findOne()
,一切都适合我。
解决方案(如果你正在使用Mongoose):确保只返回一个对象,这样你就可以解析它的object.id
,或者它将被视为一个数组,所以你需要像那样访问它{ {1}}。
答案 17 :(得分:1)
就我而言,即使我以myMethod(data:MyModelClass)
对象之类的模型格式接收数据,直到接收到的对象为字符串类型为止。
我在console.log(data)中获取内容。
解决方案只是解析JSON(就我而言)
const model:MyMOdelClass=JSON.parse(data);
这种想法可能有用。
答案 18 :(得分:1)
对我来说,这是一个与猫鼬有关的问题。
我正在遍历从Mongo查询中获得的对象。我只需要删除:
await items = Model.find()
并替换为:
await items = Model.find().lean()
答案 19 :(得分:0)
在这个答案的上下文中: https://stackoverflow.com/a/52994419
重新生成文件的解决方案可能并不总是可行的。去除字符串前的“非空格”字符。因此,如果您可以 trim
字段名称,那将清理一切。
像这样:
const records = parse(csvData, {
columns: (colNameArray) => {
return colNameArray.map((value, index) => {
return index === 0 ? value.trim() : value;
});
},
onRecord: mapper.mapRow
});
如果您不关心这一项的性能,也可以跳过 index
检查。
答案 20 :(得分:0)
我在 NodeJS API 响应中抛出的错误中没有收到 MongoDB 错误消息,因此我执行了以下操作
// It was not working
console.log(error.message) // prints the error
let response = error;
// message property was not available in the response.
/*
{
"status": "error",
"error": {
"driver": true,
"name": "MongoError",
"index": 0,
"code": 11000,
"keyPattern": {
"event_name": 1
},
"keyValue": {
"event_name": "followup"
}
}
}
*/
// so I did this
let message = error.message;
let response = JSON.parse(JSON.stringify(error));
response.message = message;
// message property is now available in the response.
/*
{
"status": "error",
"error": {
"driver": true,
"name": "MongoError",
"index": 0,
"code": 11000,
"keyPattern": {
"event_name": 1
},
"keyValue": {
"event_name": "followup"
},
"message": "E11000 duplicate key error collection: mycollections.notificationevents index: event_name_1 dup key: { event_name: \"followup\" }"
}
}
*/
答案 21 :(得分:0)
我也遇到了一个令人沮丧的问题,我尝试了setTimeout()
以及JSON.stringify
和JSON.parse
解决方案,尽管我知道它不起作用,因为我认为它们主要是JSON或承诺相关的问题,请确保它没有起作用。但就我而言,我没有立即注意到这是一个愚蠢的错误。我实际上是使用不同的大小写来访问属性名称。就像这样:
const wrongPropName = "SomeProperty"; // upper case "S"
const correctPropName = "someProperty"; // lower case "s"
const object = { someProperty: "hello world!" };
console.log('Accessing "SomeProperty":', object[wrongPropName]);
console.log('Accessing "someProperty":', object[correctPropName])
我花了一段时间才注意到,因为在我的案例中,属性名称可以全部为小写字母,也可以具有某些大小写混合的字母。事实证明,我的Web应用程序中的一个函数会使我的属性名称一团糟(在生成的键名next旁边有一个.toLowerCase()
)。
因此,吸取的教训是,更正确地检查属性名称的大小写。
答案 22 :(得分:0)
检查是否在控制台中应用了任何过滤器。我在chrome控制台中碰巧了。
答案 23 :(得分:0)
我今天在React中遇到了类似的问题。最终意识到问题是由尚未设置的状态引起的。我正在调用user.user.name
,尽管它已显示在控制台中,但是直到我包括检查是否已设置user.user
并随后调用{{1 }}。
答案 24 :(得分:0)
我也遇到了这个问题,长话短说,我的API返回的是字符串类型而不是JSON。因此,当您将其打印到日志时,它看起来完全一样,但是每当我尝试访问属性时,它都会给我带来未定义的错误。
API代码:
var response = JsonConvert.DeserializeObject<StatusResult>(string Of object);
return Json(response);
以前我只是返回:
return Json(string Of object);
答案 25 :(得分:0)
没有一个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 );
答案 26 :(得分:0)
我刚刚遇到了csv-parser从MS Excel生成的CSV文件生成的对象的问题。我可以访问除第一个属性以外的所有属性-但是如果我使用console.log编写整个对象,它将显示确定。
结果证明,UTF-8 CSV格式在开头插入了一个不可见字符对应的3个字节(ef bb bf)-csv-parser将其作为第一个属性标头的一部分包含在内。解决方案是使用非UTF选项重新生成CSV,从而消除了不可见字符。
答案 27 :(得分:0)
我有这样的问题,发现解决方案与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包装器,最初的调试对我说谎。
答案 28 :(得分:0)
我今天遇到了同样的问题。问题是由uglify-js引起的。我执行相同的非uglified代码问题后解决了。删除
--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)
答案 29 :(得分:0)
我今天遇到了同样的问题。在我的例子中,密钥是嵌套的,即key1.key2。 我使用split()拆分键,然后使用方括号表示法,这对我有效。
var data = {
key1: {
key2: "some value"
}
}
我拆分了钥匙并像这样使用了,数据[key1] [key2]为我做了这份工作。
答案 30 :(得分:0)
我有类似的问题(在为SugarCRM开发时),我开始于:
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);
}
});
,它的异步调用所以我不得不重写我的代码:
umumiy
答案 31 :(得分:-1)
如果这对某人有帮助,我遇到了类似的问题,这是因为有人在我正在使用的对象中为.toJSON创建了一个覆盖。所以对象是这样的:
{
foo: {
bar: "Hello"
baz: "World"
}
}
但.toJSON()是:
toJSON() {
return this.foo
}
所以当我调用JSON.stringify(myObject)时,它返回“{”bar“:”Hello“,”baz“:”World“}”。但是,Object.keys(myObject)显示了“foo”。