414

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

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

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

控制台输出

4

33 回答 33

371

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

相反,尝试console.log(Object.keys(config)), 甚至console.log(JSON.stringify(config))你会看到键,或者你调用时对象的状态console.log

您(通常)会在通话发现正在添加密钥。console.log

于 2013-07-09T11:25:40.997 回答
91

我刚刚使用Mongoose从 MongoDB 加载的文档遇到了这个问题。

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

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

解决方案(如果您使用的是 Mongoose):确保所有 db 字段都在mongoose.Schema(...).

于 2016-04-09T20:35:03.990 回答
31

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

这就是诀窍。

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

于 2015-08-11T21:27:52.410 回答
30

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

var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);
于 2016-01-27T13:03:04.723 回答
27

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

var a = config.col_id_3;    //undefined

setTimeout(function()
{
    var a = config.col_id_3;    //voila!

}, 100);
于 2016-03-27T18:18:14.403 回答
15

在我的例子中,我将一个对象传递给一个 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. 那是我突然想到我的对象在承诺完全更新之前就已经被评估了。

于 2016-09-21T02:18:37.067 回答
12

我今天在这个问题上苦苦挣扎,并想我会用我的解决方案来回复。

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

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

  1. console.log(data)按预期显示对象
  2. console.log(Object.keys(data))["constants","i18n"]正如预期的那样
  3. 将i18n重命名为inter并没有改变任何东西
  4. 我什至尝试切换数据以使“i18n”成为第一个对象
  5. 移动代码以绝对确保对象已完全设置并且 ajax 承诺没有问题。

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

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

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

于 2015-10-08T13:16:30.380 回答
12

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

console.log(json_string_object)

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

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

object = JSON.parse(json_string_object);
于 2016-11-01T15:27:02.977 回答
9

2018 年,Mozilla 在此处的 Mozilla Docs中向我们发出警告!

我引用“记录对象”

不使用console.log(obj); 使用console.log(JSON.parse(JSON.stringify(obj)));

这样你就可以确定在你记录它的那一刻你看到了 obj 的值。

于 2018-02-22T14:46:14.967 回答
8

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

原来,UTF-8 CSV 格式在开头插入了 3 个字节(ef bb bf),对应于一个不可见的字符 - 这些字符被 csv-parser 作为第一个属性标题的一部分包含在内。解决方案是使用非 UTF 选项重新生成 CSV,这消除了不可见字符。

于 2018-10-25T16:51:45.357 回答
6

如果这是在使用Mongoose时出现的问题,可能会发生以下情况:

console.log(object)

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

console.log(object.key)

返回未定义。

如果发生这种情况,则意味着 Mongoose Schema 中缺少密钥。添加它可以解决问题。

于 2020-07-13T11:12:41.003 回答
5

对我来说,这是一个与 Mongoose 相关的问题。

我正在遍历从 Mongo 查询中获得的对象。我只需要删除:

items = await Model.find()

并将其替换为:

items = await Model.find().lean()
于 2019-02-24T17:19:00.263 回答
4

这可能会对某人有所帮助,因为我遇到了类似的问题,其中 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-02-16T17:26:51.143 回答
3

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

原来我使用该属性find()只返回一个对象,所以我改为 find()并且findOne()一切都对我有用。

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

于 2018-04-19T13:33:22.177 回答
3

我遇到了同样的问题,上面没有任何解决方案对我有用,此后感觉就像是猜测工作。但是,将创建对象的代码包装在一个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
});
于 2017-03-15T07:21:09.067 回答
2

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

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

将响应类型设置为any为我解决了这个问题,我无法访问响应的属性,直到我设置res: any

请参阅此问题“响应”类型上不存在属性“_body”

于 2017-11-02T19:35:25.413 回答
2

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

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

思考可能有用。

于 2018-07-29T05:43:54.267 回答
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

});
于 2018-11-26T13:20:04.637 回答
1

首先检查如下类型:

console.log(typeof config);

如果上面的命令打印对象,那么您只需使用括号表示法就很容易了。如果您想动态搜索属性的值,括号表示法会非常有用。

执行以下命令:

console.log(config[col_id_3]);

如果它是一个字符串,您需要先在对象中解析。为此,您需要执行以下命令:

var object = JSON.parse(config);

之后使用括号表示法访问如下属性:

console.log(object[col_id_3]);
于 2020-07-31T14:49:03.237 回答
1

我在这个问题上尝试了很多答案,终于发现发生了什么。

尽管仅在使用时才在console.log(foo) getset方法上打印对象,但new Foo() 您必须使用平面 js 对象初始化实例

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

于 2021-11-09T11:15:37.310 回答
1

我也遇到了这个问题,长话短说,我的 API 返回的是字符串类型而不是 JSON。因此,当您将其打印到日志时,它看起来完全一样,但是每当我尝试访问属性时,它都会给我一个未定义的错误。

API 代码:

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

以前我只是回来:

return Json(string Of object);
于 2019-12-19T04:23:19.797 回答
1

我有一个类似的问题,或者可能只是相关的。

就我而言,我正在访问一个对象的属性,但其中一个是未定义的。我发现问题是在创建对象的键值时服务器端代码中的空格。

我的方法如下...

创建我的对象...注意空白

我从我的 REST API 得到的响应

用于记录值的 javascript 代码

从控制台记录结果

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

删除空格后的结果

这可能不是主题问题的问题,但适用于我的情况,可能适用于其他人。希望能帮助到你。

于 2017-04-20T08:11:17.353 回答
0

我也有这个令人沮丧的问题,我尝试了setTimeout()and the JSON.stringifyandJSON.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()在生成的键名旁边有一个)。

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

于 2020-10-05T11:11:34.693 回答
0

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

{
  foo: {
         bar: "Hello"
         baz: "World"
       }
}

但是 .toJSON() 是:

toJSON() {
  return this.foo
}

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

于 2017-08-11T20:35:37.807 回答
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检查。

于 2021-05-06T13:26:13.927 回答
0

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

于 2020-06-17T19:05:34.430 回答
0

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

var data = {
    key1: {
          key2: "some value"
       }
}

我拆分了密钥并像这样使用它,data[key1][key2] 为我完成了这项工作。

于 2017-10-11T21:02:54.257 回答
0

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 );
于 2019-09-05T15:05:31.890 回答
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);
    }
});
于 2017-06-01T09:43:26.770 回答
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\" }"
  }
}
*/
于 2021-01-14T05:34:16.400 回答
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 包装器,而最初的调试对我来说是骗人的。

于 2016-05-06T11:08:25.577 回答
0

我今天有同样的问题。问题是由 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)
于 2018-01-25T12:42:05.690 回答
0

检查您是否在控制台中应用了任何过滤器。它发生在我的 chrome 控制台中。

于 2020-08-13T10:29:24.790 回答