2013-09-26 92 views
7

在下面的代碼,JSONObject.length爲2:爲什麼JSONObject.length未定義?

var JSONObject = [{ 
    "name": "John Johnson", 
    "street": "Oslo West 16", 
    "age": 33, 
    "phone": "555 1234567" 
}, { 
    "name": "John Johnson", 
    "street": "Oslo West 16", 
    "age": 33, 
    "phone": "555 1234567" 
}]; 

然而,在下面的代碼,JSONObject.length是未定義的。爲什麼?

var JSONObject = { 
    "name": "John Johnson", 
    "street": "Oslo West 16", 
    "age": 33, 
    "phone": "555 1234567" 
}; 
+7

歡迎來到StackOverflow!讓我給你一些關於如何讓這個問題更好地讓別人回答的建議。首先,我很確定你缺少代碼:你現在的代碼不會給出任何這樣的錯誤。其次,請格式化您的代碼:您可以通過選擇代碼然後點擊文本框上方圖標欄中的「代碼示例」按鈕來執行此操作(它看起來像Grammin已經爲您完成了這項工作)。最後,確保你的問題包括代碼示例,你得到的錯誤和預期的輸出。請閱讀[問]以獲取更多信息。 –

+1

*「'var JSONObject = ...'」*這不是一個JSON對象,它是一個JavaScript對象。具體來說,它是一個JavaScript數組。 [JSON](http://json.org)是一種文本數據交換符號。源代碼不是JSON。 –

+1

這是爲什麼關閉?儘管原始文章格式不正確,但問題是有效的,問題現在非常明確(JavaScript對象沒有「.length」屬性的繼承)。 – user113215

回答

14

JavaScript沒有對象的.length屬性。如果你想解決這個問題,你必須手動迭代對象。

function objLength(obj){ 
    var i=0; 
    for (var x in obj){ 
    if(obj.hasOwnProperty(x)){ 
     i++; 
    } 
    } 
    return i; 
} 


alert(objLength(JSONObject)); //returns 4 

編輯:

因爲此Javascript已經改變,最初寫,IE8是足夠無關,你應該感到使用Object.keys(JSONObject).length,而不是安全。更乾淨。

+1

這將只返回_directly_對象的_enumerable_屬性的長度(不包括原型鏈上的枚舉)。順便說一下,這可以寫成(在現代JS中)爲Object.keys(obj).length'。 –

+1

或考慮['Object.keys'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)(可枚舉屬性)或['Object.getOwnPropertyNames' ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames)(所有屬性) – user113215

+0

這是令人難以置信的整潔Benjamin,我喜歡它。值得注意的是,它在IE8中不起作用,因此目前無法使用墊片無法使用。 – Doug

3

以下實際上是JSON對象的數組 :

var JSONObject = [{ "name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"}, {"name":"John Johnson", "street":"Oslo West 16", 
"age":33, "phone":"555 1234567" }]; 

所以,在JavaScript長度是陣列的一個屬性。而在你的第二種情況下,即

var JSONObject = {"name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"}; 

JSON對象不是數組。所以長度屬性不可用,並且將是未定義的。所以,你可以按照如下讓它作爲一個數組:

var JSONObject = [{"name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"}]; 

或者,如果你已經有了對象說JSONObject。您可以嘗試以下方法:

var JSONObject = {"name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"}; 
var jsonObjArray = []; // = new Array(); 
jsonObjArray.push(JSONObject); 

而且您確實得到了length屬性。