【问题标题】:Can't access object property, even though it shows up in a console log无法访问对象属性,即使它显示在控制台日志中
【发布时间】:2013-07-06 23:37:48
【问题描述】:

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

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

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

【问题讨论】:

  • 你可以试试console.log(JSON.stringify(config)); ans share the o/p
  • 如果可行,也试试这个 console.log(config['col_id_3']);
  • 这对我有用。使用字符串化输出作为工作对象的新输入:JSON.parse(JSON.stringify(obj))
  • 字符串化然后解析并没有解决我的问题,出于某种原因。但是完全解析确实如此。 JSON.parse(obj)
  • 出于某种原因,所有答案都解释了如何在没有密钥的情况下记录对象,而不是如何访问密钥

标签: javascript console.log


【解决方案1】:

我已经尝试了很多关于这个问题的答案 终于发现是怎么回事了。

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

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

【讨论】:

    【解决方案2】:

    在这个答案的上下文中: 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检查。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我也遇到了这个令人沮丧的问题,我尝试了 setTimeout()JSON.stringifyJSON.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() ?)。

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

        【讨论】:

          【解决方案5】:

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

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

          您(通常)会发现在您的console.log 呼叫之后添加了密钥。

          【讨论】:

          • 这种行为是错误还是功能?如果它是一个特性,它背后的原因是什么?
          • 那么如何解决这个问题呢?设置超时似乎不是一个好的解决方案。
          • 那么我们如何从对象中访问这个属性呢?
          • 澄清一下,> 按钮的行为是否因扩展数组或对象而异?
          • 这可能是异步设置属性造成的。
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            首先检查如下类型:

            console.log(typeof config);
            

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

            执行以下命令:

            console.log(config[col_id_3]);
            

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

            var object = JSON.parse(config);
            

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

            console.log(object[col_id_3]);
            

            【讨论】:

              【解决方案8】:

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

              console.log(object)
              

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

              console.log(object.key)
              

              返回未定义。

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

              【讨论】:

              • 非常感谢,我一直在用头撞墙。
              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                API 代码:

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

                以前我只是回来:

                return Json(string Of object);
                

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    【解决方案12】:

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

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

                    items = await Model.find()
                    

                    并将其替换为:

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

                    【讨论】:

                    • 感谢您向我介绍.lean()。我不知道它的存在,在 Monggose 的网站上对其进行了研究后,我很高兴我找到了它。感谢伟大的掘金。
                    【解决方案13】:

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

                    .then((res: any) =&gt; res.json())

                    将响应类型设置为 any 为我解决了这个问题,在我设置 res: any

                    之前我无法访问响应的属性

                    看到这个问题Property '_body' does not exist on type 'Response'

                    【讨论】:

                      【解决方案14】:

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

                      【讨论】:

                        【解决方案15】:

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

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

                        【讨论】:

                        • 你是英雄!感谢您发布此信息。我正在拔头发。
                        • 再次感谢您发布此消息!拯救了我的夜晚!
                        • 很棒的发现。谢谢!
                        【解决方案16】:

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

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

                        思想可能有用。

                        【讨论】:

                          【解决方案17】:

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

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

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

                          【讨论】:

                          • 这帮助我清理了我的代码。我有一个执行 Mongoose 查询的函数(现在使用 .findOne(),感谢您),它返回一个我可以在函数内以点符号访问的对象。我通过const test = await mongoFunction(query) 在代码中进一步调用Mongoose 函数,不幸的是,我的问题是返回的test 是一个数组,其中包含对象[ {object} ],我无法以点表示法访问。快把我逼疯了!
                          • 这是我的解决方案!现在 console.log() 工作正常!谢谢
                          【解决方案18】:

                          2018 年,Mozilla 在Mozilla Docs here 中警告我们!

                          我引用“记录对象”

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

                          这样你就确定你现在看到了 obj 的值 你记录它。

                          【讨论】:

                            【解决方案19】:

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

                            【讨论】:

                              【解决方案20】:

                              我今天遇到了同样的问题。问题是由 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)
                              

                              【讨论】:

                                【解决方案21】:

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

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

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

                                【讨论】:

                                  【解决方案22】:

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

                                  var a = config.col_id_3;    //undefined
                                  
                                  setTimeout(function()
                                  {
                                      var a = config.col_id_3;    //voila!
                                  
                                  }, 100);
                                  

                                  【讨论】:

                                  • 我曾经使用 onload 方法来获取我的对象值。但第一次仍然给我 undefined ..这种语言让我一天比一天死
                                  • 一个简单的解决方案是实现一个观察者承诺,检查是否使用 setTimeout 定义了所需的属性,并在属性可用时解决 + 清除超时。
                                  • 哇。在我大约 15 年的 Web 编程中,我从未遇到过这种情况,也从未考虑过控制台日志的工作原理。您的回答帮助解决了一些问题。
                                  【解决方案23】:

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

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

                                  但是 .toJSON() 是:

                                  toJSON() {
                                    return this.foo
                                  }
                                  

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

                                  【讨论】:

                                  • toJson() 这是这里没有人提到的一点。我不知道为什么这个答案被否决了,因为这是一种创建对象的方法,该对象的值与其 json 或控制台表示不同。直到我在另一个答案中发现它之前,我才知道它存在,我认为这个答案应该被赞成,因为这是考虑这些类型问题的重点。
                                  • 考虑到恰好为 0 分的答案的数量,我认为有人只是对所有内容都投了反对票。
                                  【解决方案24】:

                                  我遇到了类似的问题(在为 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);
                                      }
                                  });
                                  

                                  【讨论】:

                                    【解决方案25】:

                                    我遇到了类似的问题,或者可能只是相关的问题。

                                    对于我来说,我正在访问一个对象的属性,但其中一个是未定义的。我发现问题是在创建对象的 key,val 时服务器端代码中有一个空格。

                                    我的做法如下...

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

                                    这可能不是主题问题的问题,但适用于我的情况,也可能适用于其他人。希望对您有所帮助。

                                    【讨论】:

                                      【解决方案26】:

                                      我遇到了同样的问题,上面没有解决方案对我有用,之后感觉就像是猜测工作。但是,将创建对象的代码包装在 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
                                      });
                                      

                                      【讨论】:

                                        【解决方案27】:

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

                                        console.log(json_string_object)
                                        

                                        -> 只返回这个字符串的表示,没有办法区分是字符串还是对象。

                                        因此,我只需要将其转换回真实对象即可:

                                        object = JSON.parse(json_string_object);
                                        

                                        【讨论】:

                                        • 这是唯一对我有用的答案,并且在原始问题的 cmets 中也提到过,这应该更高。
                                        【解决方案28】:

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

                                        【讨论】:

                                          【解决方案29】:

                                          我遇到了这样的问题,发现解决方案与 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 包装器,而最初的调试对我来说是骗人的。

                                          【讨论】:

                                            【解决方案30】:

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

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

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

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

                                            【讨论】:

                                            • 很好地解释了这个问题,我认为 Mongoose 会让我在没有模式的情况下(在外部脚本中)查询 json,但会阻止写入。它似乎可以工作,因为 _id 存在,并且 console.log 说其他所有内容都应该可以访问,但不是。奇怪。
                                            • 原来我看到这个是因为JSON.stringify()(和Node的console.log())如果给定的对象有.toJSON()函数会改变它们的行为。您看到的输出是 .toJSON() 返回的,而不是原始对象。 Mongoose 为您提供带有 .toJSON() 的模型对象,该 .toJSON() 提供了底层 db 对象。模型对象仅具有您在架构中定义的字段的访问器,但是当您记录它时,所有 db 字段都会出现,因为您实际上看到的是 .toJSON() 返回的基础对象。
                                            • 为什么猫鼬不允许读取其他属性你知道吗?
                                            • 谢谢你。在控制台中看到它并且无法访问它,我快疯了。为我的架构添加了价值,我很高兴。再次感谢!
                                            • 如果您想访问架构中未定义的属性,您还可以使用toObject() 方法将返回的文档转换为 JavaScript 对象。见mongoosejs.com/docs/guide.html#toObject
                                            猜你喜欢
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            相关资源
                                            最近更新 更多