2012-01-06 17 views
47

Recentemente iniziato l'accesso a JSON, e attualmente sto cercando di utilizzare un numero come "identificatore", che non funziona troppo bene. foo:"bar" funziona bene, mentre 0:"bar" no.Utilizzo del numero come "indice" (JSON)

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

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

C'è un modo per farlo nel modo seguente? Qualcosa come Game.status[0].0 mi renderebbe la vita più facile. Ovviamente ci sono altri modi per aggirarlo, ma in questo modo è preferibile.

+1

Il motivo è che in JavaScript, come in molte altre lingue, il nome di una proprietà/variabile non può iniziare con un numero, ma solo con $, _, a-z e A-Z. Perché non 'Game.status [0]' un array? Quindi la tua sintassi sarebbe 'Game.status [0] [0]'. –

risposta

73

JSON consente solo ai nomi di chiavi di essere stringhe. Quelle stringhe possono essere costituite da valori numerici.

Tuttavia non si sta utilizzando JSON. Hai un oggetto JavaScript letterale. È possibile possibile utilizzare identificativi per le chiavi, ma un identificatore non può iniziare con un numero. Puoi comunque usare le stringhe.

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

Se si accede alle proprietà con dot-notation, è necessario utilizzare identificatori. Utilizza invece la notazione con parentesi quadra: Game[0][0].

Ma dato quei dati, un array sembrerebbe avere più senso.

+0

Ciò non permetterebbe comunque di eseguire 'Game.status [0] .0' – JaredMcAteer

+8

No, ma consentirà' Game.status [0] [0] '. – Amadan

+3

@OriginalSyn impossibile avere'Game.status [0] .0 'perché Javascript consente solo ai nomi di proprietà di iniziare con una lettera o un trattino basso se si desidera utilizzare la notazione a punti. Non c'è modo di aggirare questo. – zatatatata

0

Che dire

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

fa una di questi lavori?

PS: Quello che hai nella tua domanda è un oggetto Javascript, non JSON. JSON è la versione 'stringa' di un oggetto Javascript.

+0

"JSON è la versione 'stringa' di un oggetto Javascript." Quello non è vero. Un oggetto JSON è un sottoinsieme di un oggetto JavaScript.Altrimenti sei corretto che sia un oggetto JavaScript poiché non è conforme alle specifiche JSON – JaredMcAteer

+0

JSON è un sottoinsieme di JavaScript * notazione letterale dell'oggetto * e un oggetto JSON è un tipo di dati che può essere espresso in JSON. – Quentin

+0

@OriginalSyn: Beh, non proprio. JSON è un formato "intercambiabile" e viene utilizzato come formato di stringa indipendente dalla lingua. La maggior parte delle lingue è in grado di analizzare JSON e in Javascript diventerà un oggetto Javascript. Vedi http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/. –

4

Probabilmente avete bisogno di un array?

var Game = { 

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

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

Prima di tutto, non è JSON: JSON mandati che tutte le chiavi devono essere stringhe.

In secondo luogo, gli array regolari fanno ciò che si vuole:

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

funzionerà, se si utilizza Game.status[0][0]. Non è possibile utilizzare i numeri con la notazione a punti (.0).

In alternativa, è possibile quotare i numeri (ad esempio { "0": "val" }...); avrete oggetti semplici invece di matrici, ma funzionerà la stessa sintassi.

3

Quando il nome di una proprietà oggetto Javascript non inizia sia con un carattere di sottolineatura o una lettera, non puoi usare la notazione punto (come Game.status[0].0), e si deve utilizzare la notazione alternativa, che è Game.status[0][0].

Una nota diversa, è davvero necessario che sia un oggetto all'interno dell'array di stato? Se stai usando l'oggetto come un array, perché non usare invece un vero array?

Problemi correlati