2012-01-06 16 views
47

Recientemente comencé a indagar en JSON, y actualmente estoy tratando de usar un número como "identificador", que no funciona demasiado bien. foo:"bar" funciona bien, mientras que 0:"bar" no.Usando el número como "índice" (JSON)

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

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

¿Hay alguna manera de hacerlo de la siguiente manera? Algo como Game.status[0].0 Haría mi vida mucho más fácil. Por supuesto, hay otras formas de evitarlo, pero de esta manera es preferible.

+1

La razón de esto es que en JavaScript, como en muchos otros idiomas, el nombre de una propiedad/variable no puede comenzar con un número, pero solo con $, _, a-z y A-Z. ¿Por qué no 'Game.status [0]' una matriz? Entonces su sintaxis sería 'Game.status [0] [0]'. –

Respuesta

73

JSON solo permite que los nombres de las teclas sean cadenas. Esas cadenas pueden consistir en valores numéricos.

Usted no utiliza JSON sin embargo. Tienes un objeto de JavaScript literal. Usted puede usar identificadores para las claves, pero un identificador no puede comenzar con un número. Aún así puedes usar cadenas.

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

Si accede a las propiedades con notación de puntos, debe utilizar identificadores. Use la notación de corchetes en su lugar: Game[0][0].

Pero teniendo en cuenta esa información, una matriz parece tener más sentido.

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

Esto todavía no le permite hacer 'Game.status [0] .0' – JaredMcAteer

+8

No, pero permitirá' Game.status [0] [0] '. – Amadan

+3

@OriginalSyn es imposible tener'Game.status [0] .0 'porque Javascript solo permite que los nombres de las propiedades comiencen con una letra o un guión bajo si desea usar la notación de puntos. No hay forma de evitar eso. – zatatatata

0

¿Qué hay de

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

¿Uno de estos trabajos?

PD: Lo que tienes en tu pregunta es un objeto Javascript, no JSON. JSON es la versión de 'cadena' de un objeto Javascript.

+0

"JSON es la versión de 'cadena' de un objeto Javascript." Eso no es verdad. Un objeto JSON es un subconjunto de un objeto JavaScript.De lo contrario, tiene la razón de que es un objeto JavaScript, ya que no se ajusta a la especificación JSON – JaredMcAteer

+0

JSON es un subconjunto de la notación literal de objeto JavaScript * y un objeto JSON es un tipo de datos que se puede expresar en JSON. – Quentin

+0

@OriginalSyn: Bueno, en realidad no. JSON es un formato "intercambiable" y se utiliza como un formato de cadena independiente del idioma. La mayoría de los lenguajes pueden analizar JSON, y en Javascript, se convertirá en un objeto Javascript. Ver http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/. –

4

Probablemente necesita una matriz?

var Game = { 

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

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

En primer lugar, no es JSON: JSON exige que todas las claves sean cadenas.

En segundo lugar, las matrices regulares hacer lo que quiere:

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

funcionará, si se utiliza Game.status[0][0]. No puede usar números con la notación de puntos (.0).

O bien, puede citar los números (es decir, { "0": "val" }...); tendrá objetos simples en lugar de Arrays, pero la misma sintaxis funcionará.

3

Cuando el nombre de una propiedad de objeto Javascript no comienza ya sea con un guión o una carta, usted no puede usar la notación de puntos (como Game.status[0].0), y usted debe utilizar la notación alternativa, que es Game.status[0][0].

Una nota diferente, ¿realmente necesita que sea un objeto dentro de la matriz de estado? Si está utilizando el objeto como una matriz, ¿por qué no utilizar una matriz real en su lugar?

Cuestiones relacionadas