数値を「インデックス」として使用する(JSON)


87

最近JSONを掘り下げ始めましたが、現在、数値を「識別子」として使用しようとしていますが、うまく機能しません。foo:"bar"正常に動作しますが、動作し0:"bar"ません。

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

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

次のようにする方法はありますか?のようなものGame.status[0].0は私の人生をずっと楽にしてくれるでしょう。もちろん、それを回避する方法は他にもありますが、この方法が推奨されます。


3
これは、JavaScriptでは、他の多くの言語と同様に、プロパティ/変数の名前を数字で始めることはできず、$、_、az、およびAZでのみ始めることができるためです。なぜGame.status[0]配列ではないのですか?その場合、構文はになりますGame.status[0][0]
nikc.org 2012年

回答:


126

JSONでは、キー名のみを文字列にすることができます。これらの文字列は数値で構成できます。

ただし、JSONは使用していません。JavaScriptオブジェクトリテラルがあります。あなたはできるキーの識別子を使用していますが、識別子は数字で始めることはできません。ただし、文字列は引き続き使用できます。

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

ドット表記でプロパティにアクセスする場合は、識別子を使用する必要があります。代わりに角括弧表記を使用してください:Game.status[0][0]

しかし、そのデータを考えると、配列の方が理にかなっているように思われます。

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

これでもまだできませんGame.status[0].0
JaredMcAteer 2012年

16
いいえ、ただし許可されGame.status[0][0]ます。
アマダン2012年

4
@OriginalSyn「Game.status [0] .0」を使用することはできません。Javascriptでは、ドット表記を使用する場合、プロパティ名を文字またはアンダースコアで始めることしかできないためです。それを回避する方法はありません。
zatatatata 2012年

1
答えてくれてありがとう、まさに私が探していたもの。正直なところ、配列を最初から考えなかった理由がわかりません。脳の凍結のせいにします。
Zar 2012年

@Quentin、You aren't using JSON though. You have a JavaScript object literal. 唯一の違いは、var =JSONとJSオブジェクトリテラルの違いですか、それとももっと違いがありますか?JSオブジェクトは基本的にJSONが変数に格納されていますか?
アンドレブラトフ2015年

6

まず、JSONではありません。JSONでは、すべてのキーが文字列である必要があります。

第二に、通常の配列はあなたが望むことをします:

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

を使用すれば機能しますGame.status[0][0]。ドット表記(.0)の数字は使用できません。

または、数字を引用することもできます(つまり{ "0": "val" }...)。配列の代わりにプレーンオブジェクトがありますが、同じ構文が機能します。


5

おそらく配列が必要ですか?

var Game = {

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

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

3

Javascriptオブジェクトプロパティの名前がアンダースコアまたは文字で始まらない場合、ドット表記(のようなGame.status[0].0)を使用することはでき、代替表記を使用する必要あります。Game.status[0][0]。。

別の注意点として、ステータス配列内のオブジェクトである必要が本当にありますか?配列のようなオブジェクトを使用している場合は、代わりに実際の配列を使用してみませんか?


2

JSONは、キータイプを文字列に規制します。目的は、オブジェクトのメンバーにアクセスするためのドット表記をサポートすることです。

たとえば、person = {"height":170、 "weight":60、 "age":32}です。person.height、person.weightなどでメンバーにアクセスできます。JSONが値キーをサポートしている場合、person.0、person.1、person.2のようになります。


1
person.1、person.2などの何が問題になっているのかわかりませんか?
アンシュル

0

どうですか

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

これらのいずれかが機能しますか?

PS:質問にあるのは、JSONではなくJavascriptオブジェクトです。JSONは、Javascriptオブジェクトの「文字列」バージョンです。


「JSONはJavascriptオブジェクトの「文字列」バージョンです。」それは真実ではありません。JSONオブジェクトは、JavaScriptオブジェクトのサブセットです。それ以外の場合は、JSON仕様に準拠していないためJavaScriptオブジェクトであることが正しいです
JaredMcAteer 2012年

JSONはJavaScriptオブジェクトのリテラル表記のサブセットであり、JSONオブジェクトはJSONで表現できるデータ型です。
クエンティン

@OriginalSyn:ええ、そうではありません。JSONは「交換可能な」形式であり、言語に依存しない文字列形式として使用されます。ほとんどの言語はJSONを解析でき、JavascriptではJavascriptオブジェクトに変換されます。benalman.com/news/2010/03/theres-no-such-thing-as-a-jsonを参照してください。
Willem Mulder

1
@OriginalSyn:JavaScriptでは、JSONは常に文字列であるため、オブジェクトリテラルがJSONになることはありません。オブジェクトリテラルは文字列ではありません。「JSONオブジェクト」という用語は意味がありません。「JSON」(文字列)と「オブジェクト」(非文字列)の両方にすることはできないためです。
nnnnnn 2012年

0

JSONは「JavaScriptオブジェクト表記」です。JavaScriptは、キーが文字列または記号でなければならないことを指定しています。

MDN Docsからの次の引用では、「キー/プロパティ」という用語を使用して、「キー/値」と呼ばれることがよくあります。

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

JavaScriptでは、オブジェクトはプロパティのコレクションと見なすことができます。オブジェクトリテラル構文では、限られたプロパティのセットが初期化されます。次に、プロパティを追加および削除できます。プロパティ値は、他のオブジェクトを含む任意のタイプの値にすることができ、複雑なデータ構造を構築できます。プロパティは、キー値を使用して識別されます。キー値は、文字列値またはシンボル値のいずれかです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.