2012-01-06 18 views
47

Niedawno zacząłem kopać w JSON, a obecnie próbuję użyć liczby jako "identyfikatora", co nie działa zbyt dobrze. foo:"bar" działa dobrze, a 0:"bar" nie.Używanie numeru jako "indeksu" (JSON)

var Game = { 
    status: [ 
       { 
        0:"val", 
        1:"val", 
        2:"val" 
       }, 
       { 
        0:"val", 
        1:"val", 
        2:"val" 
       } 
      ] 
} 

alert(Game.status[0].0); 

Czy jest jakiś sposób, aby to zrobić w następujący sposób? Coś takiego jak Game.status[0].0 Ułatwiłoby mi życie. Oczywiście są na to inne sposoby, ale ten sposób jest preferowany.

+1

Powód jest taki, że w JavaScript, jak wiele innych języków, nazwa właściwości/zmiennej nie może zaczynać się od cyfry, ale tylko za pomocą $, _, a-z i A-Z. Dlaczego "Game.status [0]" nie jest tablicą? Wtedy twoja składnia byłaby 'Game.status [0] [0]'. –

Odpowiedz

73

JSON zezwala tylko na to, aby nazwy kluczy były ciągami. Łańcuchy te mogą składać się z wartości liczbowych.

Nie używasz jednak JSON. Masz literalny obiekt JavaScript. Możesz może używać identyfikatorów dla kluczy, ale identyfikator nie może zaczynać się od liczby. Nadal możesz jednak używać ciągów.

var Game={ 
    "status": [ 
     { 
      "0": "val", 
      "1": "val", 
      "2": "val" 
     }, 
     { 
      "0": "val", 
      "1": "val", 
      "2": "val" 
     } 
    ] 
} 

Jeśli uzyskasz dostęp do właściwości za pomocą dot-notation, musisz użyć identyfikatorów. Zamiast tego użyj notacji z nawiasami kwadratowymi: Game[0][0].

Jednak biorąc pod uwagę te dane, tablica wydaje się mieć więcej sensu.

var Game={ 
    "status": [ 
     [ 
      "val", 
      "val", 
      "val" 
     ], 
     [ 
      "val", 
      "val", 
      "val" 
     ] 
    ] 
} 
+0

To nadal nie pozwala ci na zrobienie 'Game.status [0] .0' – JaredMcAteer

+8

Nie, ale zezwoli na' Game.status [0] [0] '. – Amadan

+3

@OriginalSyn niemożliwe jest posiadanie'Game.status [0] .0 ', ponieważ Javascript zezwala tylko na to, aby nazwy właściwości zaczynały się od litery lub znaku podkreślenia, jeśli chcesz używać notacji kropkowej. Nie da się tego obejść. – zatatatata

0

Co

Game.status[0][0] or Game.status[0]["0"] ? 

Czy jedną z tych prac?

PS: To, co masz w swoim pytaniu, to obiekt Javascript, a nie JSON. JSON to "łańcuchowa" wersja obiektu Javascript.

+0

"JSON jest" ciągową "wersją obiektu Javascript." To nie jest prawda. Obiekt JSON jest podzbiorem obiektu JavaScript.W przeciwnym razie masz rację, że jest Obiektem JavaScript, ponieważ nie jest zgodny ze specyfikacją JSON – JaredMcAteer

+0

JSON jest podzbiorem * literalnej notacji obiektu * JavaScript, a obiekt JSON jest typem danych, który można wyrazić w JSON. – Quentin

+0

@ OrgininalSyn: Cóż, niezupełnie. JSON jest formatem "wymiennym" i jest używany jako format ciągów niezależnych od języka. Większość języków potrafi parsować JSON, a w JavaScript zmieni się w obiekt Javascript. Zobacz http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/. –

4

Prawdopodobnie potrzebujesz tablicy?

var Game = { 

    status: [ 
     ["val", "val","val"], 
     ["val", "val", "val"] 
    ] 
} 

alert(Game.status[0][0]); 
3

Po pierwsze, to nie JSON: JSON nakazuje, aby wszystkie klucze były ciągami.

drugie, regularne tablice rób co chcesz:

var Game = { 
    status: [ 
    [ 
     "val", 
     "val", 
     "val" 
    ], 
    [ 
     "val", 
     "val", 
     "val" 
    ] 
    } 
} 

będzie działać, jeśli używasz Game.status[0][0]. Nie można używać liczb z notacją kropkową (.0).

Alternatywnie możesz podać liczby (np. { "0": "val" }...); będziesz mieć proste obiekty zamiast tablic, ale ta sama składnia zadziała.

3

Gdy nazwa danej JavaScript Object m.in. nie zaczyna się ani znaku podkreślenia lub list, nie można użyć notacji kropki (jak Game.status[0].0), a musi używać alternatywnego zapisu, który jest Game.status[0][0].

Jedna inna uwaga, czy naprawdę potrzebujesz go jako obiektu w tablicy statusu? Jeśli używasz obiektu takiego jak tablica, dlaczego zamiast niego użyć prawdziwej tablicy?

Powiązane problemy