2013-07-09 38 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