2013-07-09 39 views
164

这让我感到莫名其妙。我不知道该怎么解释,但这里是我的调试代码的样子。在它下面你可以看到这两个日志的输出。第一个清楚地显示了具有我试图访问的属性的完整JavaScript对象,但是下一行代码我无法通过config.col_id_3访问它(请参阅截图中的“undefined”?)。任何人都可以解释吗?我可以访问除field_id_4之外的其他任何其他财产。无法访问对象属性,即使它存在。退货undefined

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

这就是这些的console.log()S打印在控制台

Console output

+3

你可以试试'console.log(JSON.stringify(config));'ans共享o/p –

+0

那么upload_paths呢?您可以在console.log(config.upload_paths)中获取upload_paths; – zzlalani

+1

也试试这个,如果这个工程控制台。日志(CONFIG [ 'col_id_3']); – zzlalani

回答

164

console.log(anObject)输出是误导性的;当您在控制台中展开>时,仅显示所显示对象的状态。它是而不是对象当你console.log'd对象的状态。

取而代之,请尝试console.log(Object.keys(config))或甚至console.log(JSON.stringify(config)),然后您将看到按键或当您调用console.log时的对象状态。

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

18

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

而任何的伎俩。

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

5

我这个问题今天努力了,以为我会离开回答我的解决方案。

我是通过AJAX获取数据对象,像这样: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

比方说,这个对象是一个变量称为数据。每当我参考data.i18n我得到undefined

  1. console.log(data)显示对象的要求
  2. console.log(Object.keys(data))["constants","i18n"]预期
  3. 重命名国际化没有任何改变
  4. 我甚至想切换数据,使“国际化“第一个对象
  5. 移动代码以确保对象完全设置,并且ajax承诺没有问题。

没有什么帮助......然后在服务器端我的数据写信给PHP的日志,它揭示了这一点:

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

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

9

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

var x =JSON.parse(JSON.stringify(obj)); 
console.log(x.property_actually_now_defined); 
+0

是的,它为什么这是必需的?我已经有一个JSON,为什么我需要这样做? – jain

+0

@dilpeshjain我不完全确定,但我会冒昧地说,我们实际上并没有JSON(也许有一个懒惰的加载类型的情况正在发生,我目前对此不够了解),但是传递我们所做的任何事情进入JSON.stringify需要返回一个字符串(例如打印的console.log调用需要)。因为我知道我至少可以得到一个字符串,那么我可以立即使用该字符串来创建一个JSON对象。 – Tope

14

您要访问的属性可能还不存在。 Console.log可以工作,因为它会在一小段延迟后执行,但对于其他代码来说并非如此。试试这个:

var a = config.col_id_3; //undefined 

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

}, 100); 
+0

这个工作的人,你救了我。感谢:D –

17

我只是有这个问题,使用Mongoose从MongoDB中加载的文件。

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

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

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

+0

这个问题的很好的解释,我想Mongoose会让我查询没有模式的JSON(在外部脚本中),但会阻止写入。它似乎工作,因为_id存在,并且console.log说其他所有内容都应该可访问,但不是。离奇。 – bstar

+2

原来我看到这个是因为'JSON.stringify()'(和Node的'console.log()')改变了它们的行为,如果给定的对象具有'.toJSON()'函数。您看到的输出是'.toJSON()'返回的内容,而不是原始对象。 Mongoose为模型对象提供了一个'.toJSON()',它提供了底层数据库对象。模型对象只具有您在模式中定义的字段的访问器,但是当您记录日志时,所有数据库字段都会显示,因为您实际上看到'.toJSON()'返回的基础对象。 – ramin

+0

这是一个正确的答案,很好地解释 – dd619

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包装器一个对象,最初的调试对我说谎。

1

与配置尝试[0]或配置[0] .col_id_3

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

1
config = JSON.parse(config); 

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

6

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

但是,在我看来,承诺是在对象完全完成之前返回对象......因此,我的代码的其余部分试图处理更新的对象,并且数据尚未存在。但是就像上面那样,在控制台中,我看到对象已经完全更新,但无法访问这些键 - 它们未被定义。直到我看到了这一点:

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。那就是当我发现我的目标是在诺言完全更新之前进行评估的。

5

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

console.log(json_string_object) 

- >返回该字符串只是表示,没有办法让差异是否是字符串或对象。

因此使其工作,我只是需要将其转换回真正的对象:

object = JSON.parse(json_string_object); 
-1

我有同样的问题与功能,使Ajax调用工作时。在我的情况下,我无法从服务器获取有效的错误代码。 这是函数:

function getListItem(listItemUri){ 
    return jQuery.ajax({ 
     url: listItemUri, 
     type: "Get", 
     headers: { "accept": "application/json;odata=verbose" } 
    }); 
} 

下面的代码是是不正确的,并会显示在控制台中的对象,但在尝试访问它时,将是不确定的。

var list = getListItem(uri); 
var failed = list.fail(onerror); 
console.log(failed); //displays object which included a status 
console.log(obj.status); //but when trying to retrieve the status message it was undefined 

下面的代码允许我访问对象中的值。关键在于使用list.fail作为函数,而不是将其分配给变量。

var list = getListItem(uri); 

list.fail(function(obj){ 
    console.log(obj); //displays object 
    console.log(obj.status); //the object is now defined and I am able to see the error code returned by the server 
}); 
+0

这与用户的问题如何相关并不明显。请澄清。 – B2K

1

我没有太多职位,因为没有足够的信息发表评论的刺激,但谁发表在这个下面有家伙在这里是正确的。当您尝试访问该对象时,ajax调用未完成。我甚至会走得更远,用500而不是100超时,只是为了确保。

var a = config.col_id_3; //undefined 

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

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

这可能与主题问题的情况下,问题但我的情况,并可能因此对另外一个人。希望能帮助到你。

+0

讨厌的事情,寻找。直到我找到你的答案,才使我疯狂。非常感谢。 – jrierab

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

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

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

我一直在努力,因为我在线开发,并实施了一个简单的策略。

  1. 我对我的js脚本的浏览器负载进行了反高速缓存。 引用:“为所有.css和.js文件附加查询字符串”?v = 1“以防止缓存。”
  2. 我把一个额外的控制台日志,我修改之前尝试一个新的请求: console.log(“”); 如果我没有在控制台中看到这个新日志,我知道我有一个缓存问题。

一旦我得到了正确的语法,我已经删除了前面提到的延迟,并且都很好。对我来说,我必须使用“JSON.stringify(”

0

为了防止这对某人有帮助,我遇到了类似的问题,这是因为有人在我使用的对象中为.toJSON创建了重写。因此,目标是这样的:

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

但.toJSON()是:

toJSON() { 
    return this.foo 
} 

所以,当我打电话给JSON.stringify(myObject的),它返回 “{” 吧“: ”你好“, “baz”:“World”}“但是,Object.keys(myObject)显示了”foo“。

0

优秀的建议。我只有两分钱。 解决问题的一件事是在我的请求选项中添加了'json:true'。 (这当然取决于你使用的库,但是一般前提是一样的 - 指定你期望接收的内容格式。)

0

今天我面临同样的问题。在我的情况下,键是嵌套的,即key1.key2。 我使用split()分割键,然后使用方括号表示法,这对我来说确实有效。

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

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

0

今天我有同样的问题。问题是由uglify-js引起的。我执行完相同的非简化代码问题后解决了。从uglify-js中删除

--mangle-props 

已经足够工作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) 
0

这可能帮助别人,因为我也有类似的问题,其中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... 
0

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

我引用“记录对象”

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

这种方式您可以确定您看到obj在您登录时的价值 。

+0

您给出的答案已经在[这里](https://stackoverflow.com/a/48831965/8928024)以user_CC的不同措辞给出。 – ZF007

+0

我不打算复制任何答案,我只是写下官方链接,告诉我们正确的方式来记录一个对象。 –

+0

然后,你的答案应该开始清晰的白色......而那个单独的,而不是BS的警告,这是没有意义的,你写的方式! – ZF007