2013-09-26 3 views
7

Im folgenden Code ist JSONObject.length 2:Warum ist JSONObject.length nicht definiert?

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" 
}]; 

jedoch in dem unten stehenden Code, JSONObject.length nicht definiert ist. Warum?

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

Willkommen bei StackOverflow! Lassen Sie mich Ihnen ein paar Vorschläge machen, wie Sie diese Frage besser beantworten können. Zuerst bin ich mir ziemlich sicher, dass Sie Code vermissen: Der Code, den Sie jetzt haben, gibt keinen solchen Fehler. Zweitens formatieren Sie bitte Ihren Code: Sie können dies tun, indem Sie Ihren Code auswählen und dann auf die Schaltfläche "Codebeispiel" in der Symbolleiste über dem Textfeld klicken (es sieht so aus, als hätte Grammin dies bereits für Sie getan). Stellen Sie abschließend sicher, dass Ihre Frage das Codebeispiel, den Fehler und die erwartete Ausgabe enthält. Bitte lesen Sie [Fragen] für weitere Informationen. –

+1

* "' var JSONObject = ... '" * Das ist kein JSON-Objekt, sondern ein JavaScript-Objekt. Insbesondere ist es ein JavaScript-Array. [JSON] (http://json.org) ist eine Textdatenaustauschnotation. Quellcode ist nicht JSON. –

+1

Warum ist das geschlossen? Während der ursprüngliche Beitrag nicht gut formatiert war, ist die Frage gültig und das Problem ist jetzt ziemlich klar (JavaScript-Objekte haben keine Eigenschaft inherent '.length'). – user113215

Antwort

14

JavaScript hat keine Eigenschaft .length für Objekte. Wenn Sie es ausarbeiten wollen, müssen Sie manuell durch das Objekt iterieren.

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


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

Edit:

Javascript, da diese weitergezogen wurde ursprünglich geschrieben wurde, ist IE8 irrelevant genug, dass man anstatt sich mit der Object.keys(JSONObject).length sicher fühlen sollte. Viel sauberer.

+1

Das würde nur die Länge von _enumerable_ Eigenschaften des Objekts zurückgeben, die _directly_ darauf sind (ausgenommen Aufzählungen in der Prototypkette). Dies kann übrigens (in modernem JS) als 'Object.keys (obj) .length' geschrieben werden. –

+1

Oder betrachten Sie ['Object.keys'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) (aufzählbare Eigenschaften) oder [' Object.getOwnPropertyNames' ] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames) (alle Eigenschaften) – user113215

+0

Das ist unglaublich ordentlich Benjamin, ich mag es. Es ist jedoch erwähnenswert, dass es in IE8 nicht funktioniert, so dass es momentan ohne Shims nicht verwendbar ist. – Doug

3

Das folgende ist eigentlich ein Array von JSON Objekte:

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" }]; 

Also, in JavaScript Länge eine Eigenschaft eines Arrays ist. Und in Ihrem zweiten Fall, d. H.

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

das JSON-Objekt ist kein Array. Daher ist die length-Eigenschaft nicht verfügbar und wird nicht definiert. So können Sie es als ein Array machen wie folgt:

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

Oder wenn Sie bereits Gegenstand sagen JSONObject haben. Sie können folgende versuchen:

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

Und Sie tun length Eigenschaft erhalten.