不能访问对象属性,即使它显示在控制台日志中

下面,您可以看到这两个日志的输出。第一个清楚地显示了我试图访问的属性的完整对象,但在下一行代码中,我无法使用config.col_id_3访问它(参见截图中的“未定义”?)有人能解释一下吗?我可以访问除field_id_4之外的所有其他属性。

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

这就是这些行在控制台中打印的内容

控制台输出

309320 次浏览

console.log(anObject)的输出是误导性的;只有当你在控制台中展开对象树时,通过单击>,显示的对象的状态才会被解析。它是对象的状态,当你__abc2对象。

相反,尝试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/"
}
]
}

我试图从'category'中访问'name'键,我得到了未定义的错误,因为我正在使用:

var_name = obj_array.terms.category.name

然后我意识到它有方括号,这意味着它在category键中有一个对象数组,因为它可以有多个category对象。因此,为了获得'name'键,我使用了这个:

var_name = obj_array.terms.category[0].name

这就成功了。

也许现在回答这个问题已经太晚了,但我希望有同样问题的人能像我一样在找到解决方案之前找到这个答案:)

我今天在这个问题上很纠结,我想我会留下我的解决方案。

我通过ajax获取一个数据对象,就像这样: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}} < / p >

假设这个对象在一个名为data的变量中。每当我引用data.i18n时,我得到undefined

  1. console.log(data)显示了预期的对象
  2. console.log(Object.keys(data))表示["constants","i18n"]
  3. i18n重命名为国际米兰并没有改变任何东西
  4. 我甚至尝试切换数据,使“i18n”成为第一个对象
  5. 移动代码以确保完全设置了对象,ajax承诺也没有问题。

没有什么帮助…然后在服务器端,我将数据写入php日志,它揭示了这一点:

{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}

索引键中的“i”实际上是一个u0456(西里尔字母i)。这在我的php编辑器或浏览器控制台日志中不可见。只有php日志显示这个…这是个棘手的问题……

我也有同样的问题。我的解决方案是使用字符串化输出作为解析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);

我刚刚从MongoDB使用猫鼬加载文档时遇到了这个问题。

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

事实证明,属性访问器只适用于我的mongoose.Schema(...)定义中指定的字段,而console.log()JSON.stringify()则返回存储在db中的所有字段。

解决方案(如果你使用猫鼬):确保你所有的db字段都在mongoose.Schema(...)中定义。

我遇到过这样的问题,发现解决方案与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包装器,并且最初的调试对我撒谎。

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

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

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。这时我突然想到,我的对象在承诺完全更新之前就已经被评估了。

我的数据只是json数据字符串。(这个变量在会话中存储为json字符串)。

console.log(json_string_object)

->只返回该字符串的表示形式,无法区分是string还是object。

所以为了让它工作,我只需要把它转换回真实对象:

object = JSON.parse(json_string_object);

我也遇到了同样的问题,但上面的解决方案对我来说都不奏效,之后我感觉就像是在猜测。然而,在setTimeout函数中包装创建对象的代码对我来说是有用的。< br > < br >

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

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

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

我的方法是这样的……

creating my object…注意“word”中的空白; < / >

response I get from my REST API

javascript code to log the values

log results from console

在从创建对象的服务器端代码中删除空白之后,我现在可以像下面这样访问属性了…

result after remove whitespace .

这可能不是主题问题的问题,但对我来说是这样,对其他人来说可能也是这样。希望能有所帮助。

我也遇到过类似的问题(在为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”。

我今天也遇到了同样的问题。在我的例子中,键是嵌套的,即key1.key2。 我使用split()分割键,然后使用方括号符号,这对我来说很有用
var data = {
key1: {
key2: "some value"
}
}

我把键分开并像这样使用它,data[key1][key2]为我做了这项工作。

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

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

将响应类型设置为任何为我修复了这个问题,我无法访问响应上的属性,直到我设置res:任何

参见这个问题地产& # 39;_body& # 39;类型'Response'

我今天也遇到了同样的问题。问题是由uglify-js引起的。在我执行了相同的非丑陋代码后,问题得到了解决。删除的

--mangle-props

从uglify-js中编写丑陋的代码就足够了。

也许,最好的做法是为那些必须被uglify-js的regex规则破坏的属性使用一些前缀。

来源如下:

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.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...

2018年,Mozilla在这里是Mozilla文档!

我引用< em >“日志对象”< / em >:

不要使用console.log(obj);, 使用console.log(JSON.parse(JSON.stringify(obj)));。< / p > 这样你就可以确定你现在看到的是obj的值

我刚刚从MongoDB使用Mongoose加载文档时遇到了同样的问题。

原来我使用的属性find()只返回一个对象,所以我把find()改为findOne(),一切都为我工作。

解决方案(如果你正在使用Mongoose):确保只返回一个对象,这样你就可以解析它的object.id,否则它将被视为一个数组,所以你需要像object[0].id那样访问它。

在我的情况下,它只是碰巧是,即使我接收到的数据在一个模型的格式,如myMethod(data:MyModelClass)对象,直到接收到的对象是类型为字符串。 也就是console.log(data)中的y,我得到了内容。 解决方案是解析JSON(在我的情况下)

const model:MyMOdelClass=JSON.parse(data);

思想可能是有用的。

我刚刚遇到了由CSV -parser从MS Excel生成的CSV文件生成的对象的问题。我能够访问除第一个属性之外的所有属性-但如果我使用console.log编写整个对象,它将显示ok。

结果UTF-8 CSV格式在开头插入3个字节(ef bb bf),对应于一个不可见的字符-这被包括在CSV -parser的第一个属性头中。解决方案是使用非utf选项重新生成CSV,这消除了不可见字符。

我也有类似的问题,希望下面的解决方案能帮助到别人 你可以像这里的一些人建议的那样使用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


});

对我来说,这是一个与猫鼬有关的问题。

我正在循环从Mongo查询中得到的对象。我只需要删除:

items = await Model.find()

并将其替换为:

items = await Model.find().lean()

没有一个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 );

我也遇到了这个问题,长话短说,我的API返回的是字符串类型,而不是JSON。所以当你把它打印到日志中时,它看起来完全一样,但是每当我试图访问属性时,它给了我一个未定义的错误。

API代码:

     var response = JsonConvert.DeserializeObject<StatusResult>(string Of object);
return Json(response);

之前我刚回来

return Json(string Of object);

我今天在React中遇到了类似的问题。最终意识到问题是由尚未确定的状态引起的。我正在调用user.user.name,尽管它显示在控制台中,但我似乎无法在组件中访问它,直到我包含了一个检查来检查是否设置了user.user,然后调用user.user.name

如果这是在使用猫鼬时发生的问题,则可能会发生以下情况:

console.log(object)

返回所有内容,包括所需的键。

console.log(object.key)

返回未定义。

如果发生了这种情况,就意味着Mongoose Schema中缺少键。添加它将解决这个问题。

首先,像下面这样检查类型:

console.log(typeof config);

如果上面的命令打印object,那么很简单,你只需使用括号符号。如果您想动态搜索属性的值,括号符号可能非常有用。

执行以下命令:

console.log(config[col_id_3]);

如果它是一个字符串,你需要先在对象中解析。要做到这一点,你需要执行以下命令:

var object = JSON.parse(config);

然后使用括号来访问属性,如下所示:

console.log(object[col_id_3]);

检查是否在控制台中应用了任何筛选器。它发生在我在chrome控制台。

我也有这个令人沮丧的问题,我尝试了setTimeout()JSON.stringifyJSON.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应用程序中的一个函数使我的属性名称变得混乱(它在生成的键名🤣旁边有一个.toLowerCase())。

因此,吸取的教训是,更正确地检查属性名的大小写。

我没有得到MongoDB错误消息在抛出错误在我的NodeJS API响应,所以我做了以下工作

// 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\" }"
}
}
*/

在这个答案的上下文中: https://stackoverflow.com/a/52994419 < / p >

重新生成文件的解决方案可能并不总是可行的。去掉“非空格”;字符串前的字符。所以,如果你可以trim字段名,这将清理东西。

就像这样:

const records = parse(csvData, {
columns: (colNameArray) => {
return colNameArray.map((value, index) => {
return index === 0 ? value.trim() : value;
});
},
onRecord: mapper.mapRow
});

如果你不关心这个函数的性能,也可以跳过index检查。

关于这个问题,我已经尝试了很多答案

虽然对象在console.log(foo)上打印,但仅在使用new Foo()时才生成得到方法 你必须初始化实例平面js对象

请看看:https://stackoverflow.com/a/41153231/5954248

好吧,我经过了一个让我对新循环感到害怕的情况,感谢我的老派。

forEach循环For (a in obj)循环都会产生错误信息和错误,这取决于对象的类型和属性!!

老的好

for(var i=0, max=arr.length; i<max; i++)
{ //Properties available correctly!


arr[i].property        //both work inside old school loop!
arr[i][property]
}

我也面临同样的问题。

从服务器,我返回数据在json_encode。 这样的< / p >

 echo json_encode($res);

当我返回一个不带json_encode的简单PHP数组后,问题就解决了。

return $res;