下面,您可以看到这两个日志的输出。第一个清楚地显示了具有我要访问的属性的完整对象,但是在下一行代码中,我无法访问它config.col_id_3
(请参阅屏幕截图中的“未定义”?)。谁能解释一下?我可以访问除此之外field_id_4
的所有其他财产。
console.log(config);
console.log(config.col_id_3);
这就是这些行在控制台中打印的内容
下面,您可以看到这两个日志的输出。第一个清楚地显示了具有我要访问的属性的完整对象,但是在下一行代码中,我无法访问它config.col_id_3
(请参阅屏幕截图中的“未定义”?)。谁能解释一下?我可以访问除此之外field_id_4
的所有其他财产。
console.log(config);
console.log(config.col_id_3);
这就是这些行在控制台中打印的内容
的输出console.log(anObject)
具有误导性;仅当您通过单击展开控制台中显示的对象树时,才会解析显示的对象的状态>
。当你d对象时,它不是对象的状态。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):确保所有 db 字段都在mongoose.Schema(...)
.
检查对象内部是否有对象数组。我对 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 日志显示了这一点……那是一个棘手的问题……
我的数据只是 json data string 。(此变量在会话中存储为 json 字符串)。
console.log(json_string_object)
-> 仅返回此字符串的表示形式,无法区分是字符串还是对象。
所以为了让它工作,我只需要将它转换回真实对象:
object = JSON.parse(json_string_object);
2018 年,Mozilla 在此处的 Mozilla Docs中向我们发出警告!
我引用“记录对象”:
不使用
console.log(obj);
, 使用console.log(JSON.parse(JSON.stringify(obj)));
。这样你就可以确定在你记录它的那一刻你看到了 obj 的值。
我刚刚遇到了 csv-parser 从 MS Excel 生成的 CSV 文件生成的对象的问题。我能够访问除第一个属性之外的所有属性 - 但如果我使用 console.log 编写整个对象,它会显示正常。
原来,UTF-8 CSV 格式在开头插入了 3 个字节(ef bb bf),对应于一个不可见的字符 - 这些字符被 csv-parser 作为第一个属性标题的一部分包含在内。解决方案是使用非 UTF 选项重新生成 CSV,这消除了不可见字符。
如果这是在使用Mongoose时出现的问题,可能会发生以下情况:
console.log(object)
返回所有内容,包括所需的密钥。
console.log(object.key)
返回未定义。
如果发生这种情况,则意味着 Mongoose Schema 中缺少密钥。添加它可以解决问题。
对我来说,这是一个与 Mongoose 相关的问题。
我正在遍历从 Mongo 查询中获得的对象。我只需要删除:
items = await Model.find()
并将其替换为:
items = await Model.find().lean()
这可能会对某人有所帮助,因为我遇到了类似的问题,其中 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...
我刚刚使用 Mongoose 从 MongoDB 加载文档时遇到了同样的问题。
原来我使用该属性find()
只返回一个对象,所以我改为 find()
并且findOne()
一切都对我有用。
解决方案(如果您使用的是 Mongoose):确保只返回一个对象,以便您可以解析它object.id
,否则它将被视为一个数组,因此您需要像这样访问它object[0].id
。
我遇到了同样的问题,上面没有任何解决方案对我有用,此后感觉就像是猜测工作。但是,将创建对象的代码包装在一个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
});
如果您正在使用TYPESCRIPT
和/或ANGULAR
,它可能是这个!
.then((res: any) => res.json())
将响应类型设置为any为我解决了这个问题,我无法访问响应的属性,直到我设置res: any
请参阅此问题“响应”类型上不存在属性“_body”
在我的情况下,它恰好是即使我以模型(如 myMethod(data:MyModelClass)
对象)的格式接收数据,直到接收到的对象是字符串类型。console.log(data) 中的 y 我得到了内容。解决方案只是解析 JSON(在我的情况下)
const model:MyMOdelClass=JSON.parse(data);
思考可能有用。
我有类似的问题,希望以下解决方案对某人有所帮助。
你可以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
});
首先检查如下类型:
console.log(typeof config);
如果上面的命令打印对象,那么您只需使用括号表示法就很容易了。如果您想动态搜索属性的值,括号表示法会非常有用。
执行以下命令:
console.log(config[col_id_3]);
如果它是一个字符串,您需要先在对象中解析。为此,您需要执行以下命令:
var object = JSON.parse(config);
之后使用括号表示法访问如下属性:
console.log(object[col_id_3]);
我在这个问题上尝试了很多答案,终于发现发生了什么。
尽管仅在使用时才在console.log(foo)
get和set方法上打印对象,但new Foo()
您必须使用平面 js 对象初始化实例
我也遇到了这个问题,长话短说,我的 API 返回的是字符串类型而不是 JSON。因此,当您将其打印到日志时,它看起来完全一样,但是每当我尝试访问属性时,它都会给我一个未定义的错误。
API 代码:
var response = JsonConvert.DeserializeObject<StatusResult>(string Of object);
return Json(response);
以前我只是回来:
return Json(string Of object);
我也有这个令人沮丧的问题,我尝试了setTimeout()
and the JSON.stringify
andJSON.parse
解决方案,即使我知道它不起作用,因为我认为它们主要是 JSON 或 Promise 相关的问题,果然它不起作用。但就我而言,我并没有立即注意到这是一个愚蠢的错误。我实际上是在访问具有不同大小写的属性名称。是这样的:
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 应用程序中的一个函数使我的属性名称变得一团糟(它.toLowerCase()
在生成的键名旁边有一个)。
因此,吸取教训,更正确地检查属性名称大小写。
万一这对某人有帮助,我遇到了类似的问题,这是因为有人在我正在使用的对象中为 .toJSON 创建了覆盖。所以对象是这样的:
{
foo: {
bar: "Hello"
baz: "World"
}
}
但是 .toJSON() 是:
toJSON() {
return this.foo
}
因此,当我调用 JSON.stringify(myObject) 时,它返回“{"bar": "Hello", "baz": "World"}"。然而, Object.keys(myObject) 揭示了“foo”。
在这个答案的上下文中: 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
检查。
我今天在 React 中遇到了类似的问题。最终意识到问题是由尚未设置的状态引起的。我正在打电话user.user.name
,虽然它显示在控制台中,但我似乎无法在我的组件中访问它,直到我包含一个检查以检查是否user.user
已设置然后调用user.user.name
.
我今天遇到了同样的问题。在我的例子中,键是嵌套的,即 key1.key2。我使用 split() 拆分键,然后使用方括号表示法,这对我有用。
var data = {
key1: {
key2: "some value"
}
}
我拆分了密钥并像这样使用它,data[key1][key2] 为我完成了这项工作。
JSON stringify/parse 都不适合我。
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 );
我有类似的问题(在为 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);
}
});
我在 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\" }"
}
}
*/
我遇到了这样的问题,发现解决方案与 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 包装器,而最初的调试对我来说是骗人的。
我今天有同样的问题。问题是由 uglify-js 引起的。在我执行相同的非丑化代码后,问题就解决了。删除
--mangle-props
来自 uglify-js 的代码足以运行 uglify 代码。
也许,最好的做法是为必须使用 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)
检查您是否在控制台中应用了任何过滤器。它发生在我的 chrome 控制台中。