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

时间:2013-07-09 11:22:17

标签: javascript console.log

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

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

这是console.log()在控制台中打印的内容

Console output

32 个答案:

答案 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

  1. undefined按预期显示对象
  2. console.log(data)按预期console.log(Object.keys(data))
  3. i18n 重命名为 inter 并没有改变任何内容
  4. 我甚至试图将数据切换为&#34; i18n&#34;第一个对象
  5. 移动代码以确保对象已完全设置并且ajax承诺没有问题。
  6. 没有任何帮助...然后在服务器端我将数据写入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

请参阅此问题Property '_body' does not exist on type 'Response'

答案 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。

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

creating my object... notice the white-space in "word"

response I get from my REST API

javascript code to log the values

log results from console

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

result after removing whitespace

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

答案 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.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应用程序中的一个函数会使我的属性名称一团糟(在生成的键名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”。