Utilisation du nombre comme «index» (JSON)

87

Récemment commencé à creuser dans JSON, et j'essaie actuellement d'utiliser un nombre comme "identifiant", ce qui ne fonctionne pas très bien. foo:"bar"fonctionne bien, alors 0:"bar"que non.

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

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

Y a-t-il un moyen de le faire de la manière suivante? Quelque chose comme Game.status[0].0ça me faciliterait la vie. Bien sûr, il y a d'autres façons de contourner cela, mais cette méthode est préférée.

Zar
la source
3
La raison en est qu'en JavaScript, comme de nombreux autres langages, le nom d'une propriété / variable ne peut pas commencer par un nombre, mais uniquement par $, _, az et AZ. Pourquoi pas Game.status[0]un tableau? Alors votre syntaxe serait Game.status[0][0].
nikc.org

Réponses:

127

JSON autorise uniquement les noms de clés à être des chaînes. Ces chaînes peuvent être constituées de valeurs numériques.

Cependant, vous n'utilisez pas JSON. Vous avez un objet JavaScript littéral. Vous pouvez utiliser des identifiants pour les clés, mais un identifiant ne peut pas commencer par un nombre. Vous pouvez toujours utiliser des chaînes.

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

Si vous accédez aux propriétés avec la notation par points, vous devez utiliser des identificateurs. Utilisez la notation de crochets à la place: Game.status[0][0].

Mais étant donné ces données, un tableau semble avoir plus de sens.

var Game={
    "status": [
        [
            "val",
            "val",
            "val"
        ],
        [
            "val",
            "val",
            "val"
        ]
    ]
}
Quentin
la source
Cela ne vous permettrait toujours pas de le faireGame.status[0].0
JaredMcAteer
16
Non, mais permettra Game.status[0][0].
Amadan le
4
@OriginalSyn il est impossible d'avoir ´Game.status [0] .0´ car Javascript autorise uniquement les noms de propriétés à commencer par une lettre ou un trait de soulignement si vous souhaitez utiliser la notation par points. Il n'y a pas moyen de contourner cela.
zatatatata
1
Merci beaucoup pour la réponse, exactement ce que je cherchais. Honnêtement, je n'ai aucune idée pourquoi je n'ai pas pensé à un tableau pour commencer - je le blâme sur le gel du cerveau.
Zar
@Quentin, You aren't using JSON though. You have a JavaScript object literal. La seule différence est-elle var =ou y a-t-il plus de différences entre JSON et un littéral d'objet JS? Un objet JS est-il essentiellement JSON stocké dans une variable?
Andre Bulatov
6

Tout d'abord, ce n'est pas JSON: JSON exige que toutes les clés doivent être des chaînes.

Deuxièmement, les tableaux réguliers font ce que vous voulez:

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

fonctionnera, si vous utilisez Game.status[0][0]. Vous ne pouvez pas utiliser de nombres avec la notation par points ( .0).

Alternativement, vous pouvez citer les nombres (ie { "0": "val" }...); vous aurez des objets simples au lieu de tableaux, mais la même syntaxe fonctionnera.

Amadan
la source
5

Vous avez probablement besoin d'un tableau?

var Game = {

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

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

Lorsque le nom d'une propriété d'objet Javascript ne commence ni par un trait de soulignement ni par une lettre, vous ne pouvez pas utiliser la notation par points (comme Game.status[0].0), et vous devez utiliser la notation alternative, qui estGame.status[0][0] .

Une note différente, avez-vous vraiment besoin que ce soit un objet dans le tableau d'état? Si vous utilisez l'objet comme un tableau, pourquoi ne pas utiliser un vrai tableau à la place?

zatatatata
la source
2

JSON règle le type de clé comme une chaîne. Le but est de prendre en charge la notation par points pour accéder aux membres de l'objet.

Par exemple, personne = {"hauteur": 170, "poids": 60, "âge": 32}. Vous pouvez accéder aux membres par person.height, person.weight, etc. Si JSON prend en charge les clés de valeur, alors cela ressemblerait à person.0, person.1, person.2.

Huiguorou
la source
1
Je ne vois pas ce qui ne va pas avec la personne.1, la personne.2, etc.?
Anshul
0

Qu'en est-il de

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

Est-ce que l'un de ceux-ci fonctionne?

PS: Ce que vous avez dans votre question est un objet Javascript, pas JSON. JSON est la version "chaîne" d'un objet Javascript.

Willem Mulder
la source
"JSON est la version" chaîne "d'un objet Javascript." Ce n'est pas vrai. Un objet JSON est un sous-ensemble d'un objet JavaScript. Sinon, vous avez raison de dire qu'il s'agit d'un objet JavaScript car il n'est pas conforme à la spécification JSON
JaredMcAteer
JSON est un sous-ensemble de la notation littérale d'objet JavaScript et un objet JSON est un type de données qui peut être exprimé en JSON.
Quentin
@OriginalSyn: Eh bien, pas vraiment. JSON est un format «interchangeable» et est utilisé comme format de chaîne indépendant de la langue. La plupart des langages peuvent analyser JSON, et en Javascript, il se transformera en un objet Javascript. Voir benalman.com/news/2010/03/theres-no-such-thing-as-a-json .
Willem Mulder
1
@OriginalSyn: En JavaScript, les littéraux d'objet ne sont jamais JSON, car JSON est toujours une chaîne. Les littéraux d'objet ne sont pas des chaînes. Le terme "objet JSON" n'a pas de sens, car quelque chose ne peut pas être à la fois "JSON" - une chaîne et un "objet" - une non-chaîne.
nnnnnn
0

JSON est la "notation d'objet JavaScript". JavaScript spécifie que ses clés doivent être des chaînes ou des symboles.

La citation suivante de MDN Docs utilise les termes «clé / propriété» pour désigner ce que j'entends plus souvent appelé «clé / valeur».

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

En JavaScript, les objets peuvent être considérés comme une collection de propriétés. Avec la syntaxe littérale d'objet, un ensemble limité de propriétés est initialisé; alors les propriétés peuvent être ajoutées et supprimées. Les valeurs de propriété peuvent être des valeurs de n'importe quel type, y compris d'autres objets, ce qui permet de créer des structures de données complexes. Les propriétés sont identifiées à l'aide de valeurs clés. Une valeur clé est une valeur de chaîne ou de symbole.

2540625
la source