2013-09-26 61 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属性。