Использование числа как «индекса» (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 06

Ответы:


127

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
Джаред МакАтир 06

16
Нет, но позволю Game.status[0][0].
Amadan 06

4
@OriginalSyn невозможно иметь ´Game.status [0] .0´, потому что Javascript позволяет именам свойств начинаться только с буквы или символа подчеркивания, если вы хотите использовать точечную нотацию. Нет никакого способа обойти это.
zatatatata 06

1
Большое спасибо за ответ, именно то, что я искал. Честно говоря, я понятия не имею, почему я не придумал для начала массив - я виню в этом зависание мозга.
Zar

@Quentin, You aren't using JSON though. You have a JavaScript object literal. разница только в том var =или больше различий между JSON и литералом объекта JS? Является ли объект JS в основном JSON хранимым в переменной?
Андре Булатов

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 = {"рост": 170, "вес": 60, "возраст": 32}. Вы можете получить доступ к членам по person.height, person.weight и т. Д. Если JSON поддерживает ключи значений, то он будет выглядеть как person.0, person.1, person.2.


1
Я не понимаю, что не так с person.1, person.2 и т. Д.?
Anshul

0

Что о

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

Один из них работает?

PS: В вашем вопросе есть объект Javascript, а не JSON. JSON - это строковая версия объекта Javascript.


«JSON - это строковая версия объекта Javascript». Это неправда. Объект JSON - это подмножество объекта JavaScript. В противном случае вы правы, это объект JavaScript, поскольку он не соответствует спецификации JSON,
JaredMcAteer 06

JSON - это подмножество буквенной нотации объекта JavaScript, а объект JSON - это тип данных, который может быть выражен в JSON.
Quentin

@OriginalSyn: Ну, не совсем. JSON является «взаимозаменяемым» форматом и используется как строковый формат, не зависящий от языка. Большинство языков могут анализировать JSON, а в Javascript он превращается в объект Javascript. См. Benalman.com/news/2010/03/theres-no-such-thing-as-a-json .
Виллем Малдер

1
@OriginalSyn: в JavaScript литералы объектов никогда не являются JSON, потому что JSON всегда является строкой. Литералы объекта не являются строками. Термин «объект JSON» не имеет смысла, потому что что-то не может быть одновременно «JSON» - строкой и «объектом» - не строкой.
nnnnnn

0

JSON - это «нотация объектов JavaScript». JavaScript указывает, что его ключи должны быть строками или символами.

Следующая цитата из MDN Docs использует термины «ключ / свойство» для обозначения того, что я чаще слышу как «ключ / значение».

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

В JavaScript объекты можно рассматривать как набор свойств. С помощью синтаксиса литерала объекта инициализируется ограниченный набор свойств; затем свойства можно добавлять и удалять. Значения свойств могут быть значениями любого типа, включая другие объекты, что позволяет создавать сложные структуры данных. Свойства идентифицируются с помощью ключей-значений. Значение ключа - это либо значение String, либо значение Symbol.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.