Використання числа як "індексу" (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

Відповіді:


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
JaredMcAteer

16
Ні, але дозволить Game.status[0][0].
Амадан

4
@OriginalSyn неможливо мати "Game.status [0] .0", оскільки Javascript дозволяє назви властивостей починатися з літери або підкреслення, лише якщо ви хочете використовувати крапкові позначення. Це ніяк не можна обійти.
zatatatata

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

JSON - це підмножина літеральної нотації об’єкта JavaScript, а об’єкт JSON - це тип даних, який може бути виражений у JSON.
Квентін

@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 об'єкти можна розглядати як сукупність властивостей. За допомогою синтаксису об’єктного літералу ініціалізується обмежений набір властивостей; тоді властивості можна додавати та видаляти. Значеннями властивостей можуть бути значення будь-якого типу, включаючи інші об'єкти, що дозволяє будувати складні структури даних. Властивості визначаються за допомогою ключових значень. Ключовим значенням є або рядок, або значення символу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.