2013-09-26 9 views
7

W kodzie poniżej JSONObject.length wynosi 2:Dlaczego plik JSONObject.length jest niezdefiniowany?

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

Jednak w poniższym kodzie JSONObject.length jest nieokreślona. Czemu?

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

Witamy w StackOverflow! Pozwól, że przedstawię ci kilka sugestii, jak lepiej odpowiedzieć na to pytanie, aby inni mogli na nie odpowiedzieć. Po pierwsze, jestem prawie pewien, że brakuje ci kodu: kod, który masz teraz, nie daje takiego błędu. Po drugie, sformatuj swój kod: możesz to zrobić, wybierając swój kod, a następnie naciskając przycisk "Próbka kodu" na pasku ikon nad polem tekstowym (wygląda na to, że Grammin już to zrobił). Na koniec upewnij się, że Twoje pytanie zawiera próbkę kodu, błąd, który otrzymujesz, oraz OCZEKIWANE WYJŚCIE. Przeczytaj [Zapytaj], aby uzyskać więcej informacji. –

+1

* "' var JSONObject = ... '" * To nie jest obiekt JSON, jest to obiekt JavaScript. W szczególności jest to tablica JavaScript. [JSON] (http://json.org) to tekstowa notacja wymiany danych. Kod źródłowy nie jest JSON. –

+1

Dlaczego to jest zamknięte? Mimo że oryginalny post nie był dobrze sformatowany, pytanie jest poprawne, a problem jest już całkiem jasny (obiekty JavaScript nie mają właściwości '.length' dziedziczącej). – user113215

Odpowiedz

14

JavaScript nie ma właściwości .length dla obiektów. Jeśli chcesz go rozwiązać, musisz ręcznie wykonać iterację obiektu.

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 został przeniesiony na ponieważ ten został napisany, IE8 jest na tyle istotne, że powinien czuć się bezpiecznie w użyciu Object.keys(JSONObject).length zamiast. Znacznie czystsze.

+1

Zwróciłoby to tylko długość _enumerable_ właściwości obiektu, które są _directly_ na nim (wykluczając wyliczenia w łańcuchu prototypów). Można to napisać (w nowoczesnym JS) jako 'Object.keys (obj) .length' przy okazji. –

+1

Lub rozważ ["Object.keys"] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) (właściwości przeliczalne) lub ['Object.getOwnPropertyNames' ] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames) (wszystkie właściwości) – user113215

+0

To niewiarygodnie czysty Benjamin, podoba mi się. Warto jednak zauważyć, że nie działa on w IE8, więc obecnie nie nadaje się do użytku bez podkładek. – Doug

3

Poniżej rzeczywiście tablicą JSON obiektów :

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

Więc długości JavaScript jest własnością tablicy. W drugim przypadku, tj.

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

obiekt JSON nie jest tablicą. Tak więc właściwość length nie jest dostępna i będzie niezdefiniowana. Więc można je w postaci tablicy w następujący sposób:

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

Lub jeśli masz już przedmiot powiedzieć JSONObject. Można spróbować następujących czynności:

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

I dostaniesz length nieruchomości.

Powiązane problemy