Usando número como “índice” (JSON)

87

Recentemente comecei a me aprofundar em JSON e atualmente estou tentando usar um número como "identificador", o que não funciona muito bem. foo:"bar"funciona bem, enquanto 0:"bar"não.

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

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

Existe alguma maneira de fazer isso da seguinte maneira? Algo como Game.status[0].0Tornaria minha vida mais fácil. Claro que há outras maneiras de contornar isso, mas essa é a preferida.

Zar
fonte
3
A razão para isso é que em JavaScript, como em muitas outras linguagens, o nome de uma propriedade / variável não pode começar com um número, mas apenas com $, _, az e AZ. Por que não é Game.status[0]um array? Então sua sintaxe seria Game.status[0][0].
nikc.org

Respostas:

127

JSON permite apenas que nomes de chave sejam strings. Essas strings podem consistir em valores numéricos.

No entanto, você não está usando JSON. Você tem um literal de objeto JavaScript. Você pode usar identificadores para chaves, mas um identificador não pode começar com um número. Você ainda pode usar strings.

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

Se você acessar as propriedades com notação de ponto, terá que usar identificadores. Use a notação colchete em vez disso: Game.status[0][0].

Mas, dados esses dados, um array parece fazer mais sentido.

var Game={
    "status": [
        [
            "val",
            "val",
            "val"
        ],
        [
            "val",
            "val",
            "val"
        ]
    ]
}
Quentin
fonte
Isso ainda não permitiria que você fizesseGame.status[0].0
JaredMcAteer
16
Não, mas vai permitir Game.status[0][0].
Amadan
4
@OriginalSyn é impossível ter ´Jogo.status [0] .0´ porque Javascript só permite que nomes de propriedades comecem com uma letra ou um sublinhado se você quiser usar a notação de ponto. Não há maneira de contornar isso.
zatatatata
1
Muito obrigado pela resposta, exatamente o que eu estava procurando. Honestamente, não tenho ideia de por que não pensei em um array para começar - vou culpar o congelamento do cérebro.
Zar
@Quentin, You aren't using JSON though. You have a JavaScript object literal. é a única diferença var =ou existem mais diferenças entre JSON e um literal de objeto JS? Um objeto JS é basicamente JSON armazenado em uma variável?
Andre Bulatov
6

Em primeiro lugar, não é JSON: o JSON exige que todas as chaves sejam strings.

Em segundo lugar, os arrays regulares fazem o que você quer:

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

vai funcionar, se você usar Game.status[0][0]. Você não pode usar números com a notação de ponto ( .0).

Como alternativa, você pode citar os números (ou seja { "0": "val" }...); você terá objetos simples em vez de Arrays, mas a mesma sintaxe funcionará.

Amadan
fonte
5

Provavelmente você precisa de um array?

var Game = {

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

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

Quando o nome de uma propriedade de objeto Javascript não começa com um sublinhado ou uma letra, você não pode usar a notação de ponto (como Game.status[0].0) e deve usar a notação alternativa, que é Game.status[0][0].

Uma observação diferente, você realmente precisa que ele seja um objeto dentro da matriz de status? Se você estiver usando o objeto como um array, por que não usar um array real?

zatatatata
fonte
2

JSON regula o tipo de chave para ser string. O objetivo é oferecer suporte à notação de ponto para acessar os membros do objeto.

Por exemplo, pessoa = {"altura": 170, "peso": 60, "idade": 32}. Você pode acessar os membros por pessoa.altura, pessoa.peso, etc. Se o JSON oferecer suporte a chaves de valor, será semelhante a pessoa.0, pessoa.1, pessoa.2.

Huiguorou
fonte
1
Não vejo o que há de errado com pessoa.1, pessoa.2 etc?
Anshul
0

A respeito

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

Um desses funciona?

PS: O que você tem em sua pergunta é um objeto Javascript, não JSON. JSON é a versão 'string' de um objeto Javascript.

Willem Mulder
fonte
"JSON é a versão 'string' de um objeto Javascript." Isso não é verdade. Um objeto JSON é um subconjunto de um objeto JavaScript. Caso contrário, você está correto que é um objeto JavaScript, pois não está de acordo com a especificação JSON
JaredMcAteer
JSON é um subconjunto da notação literal de objeto JavaScript e um objeto JSON é um tipo de dados que pode ser expresso em JSON.
Quentin
@OriginalSyn: Bem, não realmente. JSON é um formato "intercambiável" e é usado como um formato de string independente de idioma. A maioria das linguagens pode analisar JSON e, em Javascript, ele se tornará um objeto Javascript. Consulte benalman.com/news/2010/03/theres-no-such-thing-as-a-json .
Willem Mulder
1
@OriginalSyn: Em JavaScript, os literais de objeto nunca são JSON, porque JSON é sempre uma string. Literais de objeto não são strings. O termo "objeto JSON" não faz sentido, porque algo não pode ser "JSON" - uma string e um "objeto" - uma não string.
nnnnnn
0

JSON é "JavaScript Object Notation". JavaScript especifica que suas chaves devem ser strings ou símbolos.

A seguinte citação do MDN Docs usa os termos "chave / propriedade" para se referir ao que eu ouço mais frequentemente denominado como "chave / valor".

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Objects

Em JavaScript, os objetos podem ser vistos como uma coleção de propriedades. Com a sintaxe literal do objeto, um conjunto limitado de propriedades é inicializado; então as propriedades podem ser adicionadas e removidas. Os valores das propriedades podem ser valores de qualquer tipo, incluindo outros objetos, o que permite construir estruturas de dados complexas. As propriedades são identificadas por meio de valores-chave. Um valor-chave é um valor String ou Symbol.

2540625
fonte