python如何避免访问对象不存在的属性_javascript - 无法访问对象属性,即使它存在。 返回undefined...

javascript - 无法访问对象属性,即使它存在。 返回undefined

这令我困惑。 我不知道怎么解释这个,但这是我的调试代码的样子。 在它下面,您可以看到这两个日志的输出。 第一个清楚地显示了我正在尝试访问的属性的完整JavaScript对象,但下一行代码我无法使用config.col_id_3访问它(请参阅屏幕截图中的“undefined”?)。 有谁能解释一下? 我也可以访问除field_id_4之外的所有其他属性。

console.log(config);

console.log(config.col_id_3);

这就是这些console.log()在Console中打印的内容

28个解决方案

210 votes

console.log(anObject)的输出有误导成分; 只有在控制台中展开console.log时,才会解析显示的对象的状态。 当你对象console.log(JSON.stringify(config))时,它不是对象的状态。

相反,请尝试console.log,甚至console.log(JSON.stringify(config)),您将看到键,或者在您调用console.log时对象的状态。

您(通常)会在console.log呼叫后找到正在添加的密钥。

Matt answered 2019-03-05T10:17:28Z

29 votes

我刚刚使用Mongoose从MongoDB加载了一个文档。

在整个对象上运行mongoose.Schema(...)时,将显示所有文档字段(存储在数据库中)。 但是,当其他人(包括JSON.stringify())工作正常时,一些个人财产访问者将返回console.log()。

原来,属性访问器仅适用于我的mongoose.Schema(...)定义中指定的那些字段,而console.log()和JSON.stringify()返回存储在db中的所有字段。

解决方案(如果您使用的是Mongoose):确保所有数据库字段都在mongoose.Schema(...)中定义。

ramin answered 2019-03-05T10:18:19Z

21 votes

检查对象内部是否有一个对象数组。 我有一个与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

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

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

这就是诀窍。

也许这个答案为时已晚,但我希望有同样问题的人会在找到解决方案之前找到这个问题:)

Asaf Lopez answered 2019-03-05T10:19:16Z

17 votes

您尝试访问的属性可能尚不存在。 Console.log之所以有效,是因为它在一小段延迟后执行,但其余代码则不然。 试试这个:

var a = config.col_id_3; //undefined

setTimeout(function()

{

var a = config.col_id_3; //voila!

}, 100);

Lai Xue answered 2019-03-05T10:19:47Z

13 votes

我遇到过同样的问题。 我的解决方案是使用字符串化输出作为解析JSON的输入。 这对我有用。 希望它对你有用

var x =JSON.parse(JSON.stringify(obj));

console.log(x.property_actually_now_defined);

Tope answered 2019-03-05T10:20:15Z

8 votes

在我的情况下,我将一个对象传递给一个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。那时我发现我的对象在承诺完全更新之前被评估了。

rolinger answered 2019-03-05T10:20:57Z

7 votes

我今天在这个问题上挣扎,并且认为我会用我的解决方案回复。

我是通过ajax获取数据对象,如下所示:{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}

假设这个对象位于一个名为data的变量中。 每当我引用{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}时,我得到了["constants","i18n"]。

{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}按预期显示了该对象

{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}表示["constants","i18n"]如预期

将i18n重命名为inter并没有改变任何东西

我甚至试图切换数据,使“i18n”成为第一个对象

移动代码以确保对象完全设置并且ajax承诺没有问题。

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

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

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

Jette answered 2019-03-05T10:22:56Z

6 votes

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

console.log(json_string_object)

- > 只返回此字符串的表示形式,无论是字符串还是对象,都无法区分。

所以为了使它工作我只需要将它转换回真实对象:

object = JSON.parse(json_string_object);

makkasi answered 2019-03-05T10:23:43Z

3 votes

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

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

将响应类型设置为任何修复此问题对我来说,我无法访问响应的属性,直到我设置res:any

看到这个问题属性'_body'在'Response'类型上不存在

russiansummer answered 2019-03-05T10:24:35Z

3 votes

我不会在这里发布很多,因为没有足够的帖子来评论,但发布下面的人是正确的。 当您尝试访问该对象时,ajax调用未完成。 我甚至会更进一步,使用500而不是100作为超时,只是为了确定。

var a = config.col_id_3; //undefined

setTimeout(function()

{

var a = config.col_id_3; //voila!

}, 500);

almcaffee answered 2019-03-05T10:25:05Z

1 votes

尝试使用config [0]或config [0] .col_id_3

我也遇到了这个问题,我能够看到一个Object来记录它,但是没有从代码中访问它。 我尝试在它前面添加一个[0]并解决了我的问题。 然后我可以访问所有属性。

Leonardo Atalla answered 2019-03-05T10:25:40Z

1 votes

config = JSON.parse(config);

我有同样的,数据是文本,而不是我期待的JSON。

obotezat answered 2019-03-05T10:26:08Z

1 votes

我有同样的问题,上面没有任何解决方案适合我,有点像猜测之后的工作。 但是,包装我在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

});

Tushar Shukla answered 2019-03-05T10:26:36Z

1 votes

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

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

我的方法如下......

从创建对象的服务器端代码中删除空格后,我现在可以访问该属性,如下所示...

这可能不是主题问题的问题,而是针对我的情况,对于其他人可能也是如此。 希望能帮助到你。

rey_coder answered 2019-03-05T10:27:38Z

1 votes

这可能对某人有所帮助,因为我有一个类似的问题,其中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...

user_CC answered 2019-03-05T10:28:13Z

1 votes

在我的情况下,它恰好是,即使我以myMethod(data:MyModelClass)对象的模型的格式接收数据,直到收到的对象是字符串类型。我在console.log(数据)中得到了内容。解决方案就是解析JSON(在我的例子中)

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

思想可能有用。

Karthikeyan M answered 2019-03-05T10:28:50Z

0 votes

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

Marcus Downing answered 2019-03-05T10:29:33Z

0 votes

我有类似的问题(开发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);

}

});

Mariyo answered 2019-03-05T10:30:09Z

0 votes

这里的优秀建议。 我会添加,因为有人可能会觉得它很有用。

非常了解缓存,在浏览器中或远程。

我正在努力解决这个问题,因为我在线开发,并实施了一个简单的策略。

我把反缓存放在我的js脚本的浏览器加载上。quote:“将查询字符串”?v = 1“附加到所有.css和.js文件以防止缓存。”

在尝试新请求之前,我添加了一个我修改的额外控制台日志:的console.log(“”);如果我在控制台中没有看到这个新日志,我知道我在某个地方有一个缓存问题。

一旦我的语法正确,我已经删除了之前建议的延迟,一切都很好。 对我来说,我不得不使用“JSON.stringify(”

Frieda answered 2019-03-05T10:31:14Z

0 votes

为了防止这对某人有帮助,我遇到了类似的问题,这是因为有人在我正在使用的对象中为.toJSON创建了一个覆盖。 所以对象是这样的:

{

foo: {

bar: "Hello"

baz: "World"

}

}

但.toJSON()是:

toJSON() {

return this.foo

}

因此,当我调用JSON.stringify(myObject)时,它返回“{”bar“:”Hello“,”baz“:”World“}”。 但是,Object.keys(myObject)显示了“foo”。

emote_control answered 2019-03-05T10:31:58Z

0 votes

很好的建议。 我刚才有类似的问题,所以我的两分钱。修复问题的一件事是在我的请求选项中添加了'json:true'。 (当然这取决于您使用的库,但是一般前提是相同的 - 指定您希望接收的内容格式。)

itsKarma answered 2019-03-05T10:32:27Z

0 votes

我今天遇到了同样的问题。 在我的例子中,密钥是嵌套的,即key1.key2。我使用split()拆分键,然后使用方括号表示法,这对我有用。

var data = {

key1: {

key2: "some value"

}

}

我分开了键并像这样使用它,数据[key1] [key2]为我完成了这项工作。

C.O.G answered 2019-03-05T10:33:03Z

0 votes

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

--mangle-props

来自uglify-js就足以使用uglified代码了。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值