Menggunakan angka sebagai "indeks" (JSON)

89

Baru-baru ini mulai menggali JSON, dan saat ini saya mencoba menggunakan nomor sebagai "pengenal", yang tidak berfungsi dengan baik. foo:"bar"berfungsi dengan baik, sementara 0:"bar"tidak.

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

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

Apakah ada cara untuk melakukannya dengan cara berikut? Sesuatu seperti Game.status[0].0Akan membuat hidup saya jauh lebih mudah. Tentu saja ada cara lain untuk menyiasatinya, tetapi cara ini lebih disukai.

Zar
sumber
3
Alasannya adalah karena di JavaScript, seperti banyak bahasa lainnya, nama properti / variabel tidak boleh dimulai dengan angka, tetapi hanya dengan $, _, az dan AZ. Mengapa bukan Game.status[0]sebuah array? Maka sintaks Anda akan menjadi Game.status[0][0].
nikc.org

Jawaban:

132

JSON hanya mengizinkan nama kunci menjadi string. String tersebut dapat terdiri dari nilai numerik.

Anda tidak menggunakan JSON. Anda memiliki objek JavaScript literal. Anda dapat menggunakan pengenal untuk kunci, tetapi pengenal tidak dapat dimulai dengan angka. Anda masih bisa menggunakan string.

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

Jika Anda mengakses properti dengan notasi titik, maka Anda harus menggunakan pengenal. Menggunakan notasi braket persegi sebagai gantinya: Game.status[0][0].

Tetapi mengingat data itu, array akan tampak lebih masuk akal.

var Game={
    "status": [
        [
            "val",
            "val",
            "val"
        ],
        [
            "val",
            "val",
            "val"
        ]
    ]
}
Quentin
sumber
Ini tetap tidak memungkinkan Anda melakukannyaGame.status[0].0
JaredMcAteer
16
Tidak, tapi akan mengizinkan Game.status[0][0].
Amadan
4
@OriginalSyn tidak mungkin memiliki ´Game.status [0] .0´ karena Javascript hanya mengizinkan nama properti untuk dimulai dengan huruf atau garis bawah jika Anda ingin menggunakan notasi titik. Tidak ada jalan lain.
zatatatata
1
Terima kasih banyak atas jawabannya, persis seperti yang saya cari. Sejujurnya, saya tidak tahu mengapa saya tidak memikirkan array untuk memulai - saya akan menyalahkannya pada pembekuan otak.
Zar
@Quentin, You aren't using JSON though. You have a JavaScript object literal. Apakah satu-satunya perbedaan var =atau apakah ada lebih banyak perbedaan antara JSON dan literal objek JS? Apakah objek JS pada dasarnya JSON disimpan dalam variabel?
Andre Bulatov
7

Pertama, ini bukan JSON: JSON mengamanatkan bahwa semua kunci harus berupa string.

Kedua, array biasa melakukan apa yang Anda inginkan:

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

akan bekerja, jika Anda menggunakan Game.status[0][0]. Anda tidak dapat menggunakan angka dengan notasi titik ( .0).

Atau, Anda dapat mengutip angka-angka (yaitu { "0": "val" }...); Anda akan memiliki objek biasa, bukan Array, tetapi sintaks yang sama akan berfungsi.

Amadan
sumber
5

Mungkin Anda membutuhkan array?

var Game = {

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

alert(Game.status[0][0]);
yatskevich
sumber
3

Ketika nama properti objek Javascript tidak dimulai dengan garis bawah atau huruf, Anda tidak dapat menggunakan notasi titik (seperti Game.status[0].0), dan Anda harus menggunakan notasi alternatif, yaituGame.status[0][0] .

Satu catatan berbeda, apakah Anda benar-benar membutuhkannya untuk menjadi objek di dalam larik status? Jika Anda menggunakan objek seperti array, mengapa tidak menggunakan array yang sebenarnya?

zatatatata
sumber
2

JSON mengatur jenis kunci menjadi string. Tujuannya untuk mendukung notasi titik untuk mengakses anggota objek.

Misalnya, person = {"height": 170, "weight": 60, "age": 32}. Anda dapat mengakses anggota berdasarkan person.height, person.weight, dll. Jika JSON mendukung kunci nilai, maka akan terlihat seperti person.0, person.1, person.2.

Huiguorou
sumber
1
Saya tidak melihat apa yang salah dengan person.1, person.2 dll?
Anshul
1

JSON adalah "JavaScript Object Notation". JavaScript menentukan kuncinya harus berupa string atau simbol.

Kutipan berikut dari MDN Docs menggunakan istilah "kunci / properti" untuk merujuk pada apa yang lebih sering saya dengar sebagai "kunci / nilai".

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

Dalam JavaScript, objek dapat dilihat sebagai kumpulan properti. Dengan sintaks literal objek, sekumpulan properti terbatas diinisialisasi; kemudian properti dapat ditambahkan dan dihapus. Nilai properti dapat berupa nilai jenis apa pun, termasuk objek lain, yang memungkinkan pembuatan struktur data kompleks. Properti diidentifikasi menggunakan nilai kunci. Nilai kunci bisa berupa nilai String atau Simbol.

2540625
sumber
0

Bagaimana dengan

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

Apakah salah satu dari ini berfungsi?

PS: Apa yang Anda miliki dalam pertanyaan Anda adalah Objek Javascript, bukan JSON. JSON adalah versi 'string' dari Objek Javascript.

Willem Mulder
sumber
"JSON adalah versi 'string' dari Objek Javascript." Itu tidak benar. Objek JSON adalah bagian dari Objek JavaScript. Jika tidak, Anda benar bahwa itu adalah Objek JavaScript karena tidak sesuai dengan spesifikasi JSON
JaredMcAteer
JSON adalah subset dari notasi literal objek JavaScript dan objek JSON adalah tipe data yang dapat diekspresikan dalam JSON.
Quentin
@OriginalSyn: Yah, tidak juga. JSON adalah format "dapat dipertukarkan", dan digunakan sebagai format string yang tidak bergantung pada bahasa. Sebagian besar bahasa dapat mengurai JSON, dan dalam Javascript, itu akan berubah menjadi Objek Javascript. Lihat benalman.com/news/2010/03/theres-no-such-thing-as-a-json .
Willem Mulder
1
@OriginalSyn: Dalam JavaScript, literal objek tidak pernah JSON, karena JSON selalu berupa string. Literal objek bukanlah string. Istilah "objek JSON" tidak masuk akal, karena sesuatu tidak bisa berupa "JSON" - string, dan "object" - non-string.
nnnnnn