การใช้ตัวเลขเป็น "ดัชนี" (JSON)


89

เพิ่งเริ่มขุดใน 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

คำตอบ:


132

JSON อนุญาตให้คีย์ชื่อเป็นสตริงเท่านั้น สตริงเหล่านั้นสามารถประกอบด้วยค่าตัวเลข

คุณไม่ได้ใช้ JSON คุณมี JavaScript object literal คุณสามารถใช้ตัวระบุสำหรับคีย์ได้ แต่ตัวระบุไม่สามารถขึ้นต้นด้วยตัวเลขได้ คุณยังสามารถใช้สตริงได้

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]แต่จะช่วยให้
Amadan

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 object literal หรือไม่? ออบเจ็กต์ JS โดยทั่วไป JSON ถูกเก็บไว้ในตัวแปรหรือไม่?
Andre Bulatov

7

ก่อนอื่นไม่ใช่ JSON: JSON กำหนดว่าคีย์ทั้งหมดต้องเป็นสตริง

ประการที่สองอาร์เรย์ปกติทำสิ่งที่คุณต้องการ:

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

Game.status[0][0]จะทำงานถ้าคุณใช้ คุณไม่สามารถใช้ตัวเลขกับสัญกรณ์จุด ( .0)

หรือคุณสามารถอ้างตัวเลข (เช่น{ "0": "val" }...); คุณจะมีวัตถุธรรมดาแทน Arrays แต่ไวยากรณ์เดียวกันจะใช้งานได้



3

เมื่อชื่อวัตถุคุณสมบัติของจาวาสคริปต์ไม่ได้เริ่มต้นด้วยการขีดเส้นใต้หรือตัวอักษรที่คุณลาดเทใช้สัญกรณ์ dot (ชอบGame.status[0].0) และคุณจะต้องGame.status[0][0]ใช้สัญกรณ์ทางเลือกซึ่งเป็น

หมายเหตุที่แตกต่างกันคุณต้องการให้เป็นวัตถุภายในอาร์เรย์สถานะหรือไม่? หากคุณใช้วัตถุเช่นอาร์เรย์ทำไมไม่ใช้อาร์เรย์จริงแทนล่ะ


2

JSON ควบคุมประเภทคีย์ให้เป็นสตริง มีวัตถุประสงค์เพื่อสนับสนุนสัญกรณ์จุดเพื่อเข้าถึงสมาชิกของวัตถุ

ตัวอย่างเช่น person = {"height": 170, "weight": 60, "age": 32} คุณสามารถเข้าถึงสมาชิกโดยบุคคลความสูงบุคคลน้ำหนัก ฯลฯ หาก JSON รองรับคีย์ค่าจะมีลักษณะเป็นบุคคล 0 บุคคล 1 บุคคล 2.


1
ฉันไม่เห็นว่ามีอะไรผิดปกติกับบุคคล 1 บุคคล 2 ฯลฯ ?
Anshul

1

JSON คือ "JavaScript Object Notation" JavaScript ระบุคีย์ต้องเป็นสตริงหรือสัญลักษณ์

ใบเสนอราคาต่อไปนี้จาก MDN Docs ใช้คำว่า "คีย์ / คุณสมบัติ" เพื่ออ้างถึงสิ่งที่ฉันมักได้ยินเรียกว่า "คีย์ / ค่า"

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

ใน JavaScript วัตถุสามารถมองเห็นได้ว่าเป็นชุดของคุณสมบัติ ด้วยไวยากรณ์ตามตัวอักษรของวัตถุชุดคุณสมบัติที่ จำกัด จะถูกเตรียมใช้งาน จากนั้นสามารถเพิ่มและลบคุณสมบัติได้ ค่าคุณสมบัติอาจเป็นค่าประเภทใดก็ได้รวมถึงวัตถุอื่น ๆ ซึ่งทำให้สามารถสร้างโครงสร้างข้อมูลที่ซับซ้อนได้ คุณสมบัติถูกระบุโดยใช้ค่าคีย์ ค่าคีย์คือค่าสตริงหรือสัญลักษณ์


0

เกี่ยวกับ

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

หนึ่งในนี้ใช้งานได้หรือไม่?

PS: สิ่งที่คุณมีในคำถามคือ Javascript Object ไม่ใช่ JSON JSON เป็นเวอร์ชัน 'สตริง' ของวัตถุ Javascript


"JSON เป็นเวอร์ชัน" สตริง "ของวัตถุ Javascript" นั่นไม่เป็นความจริง ออบเจ็กต์ JSON เป็นส่วนย่อยของวัตถุ JavaScript มิฉะนั้นคุณจะถูกต้องว่าเป็นวัตถุ JavaScript เนื่องจากไม่เป็นไปตามข้อกำหนด JSON
JaredMcAteer

JSON เป็นส่วนย่อยของสัญกรณ์ไลเทอร์ออบเจ็กต์ JavaScript และออบเจ็กต์ JSON เป็นชนิดข้อมูลที่สามารถแสดงใน JSON
Quentin

@OriginalSyn: อืมไม่จริง JSON เป็นรูปแบบที่ "ใช้แทนกันได้" และใช้เป็นรูปแบบสตริงที่ไม่ขึ้นกับภาษา ภาษาส่วนใหญ่สามารถแยกวิเคราะห์ JSON ได้และใน Javascript จะเปลี่ยนเป็น Javascript Object ดูbenalman.com/news/2010/03/theres-no-such-thing-as-a-json
Willem Mulder

1
@OriginalSyn: ใน JavaScript, ตัวอักษรวัตถุไม่เคย JSON เพราะ JSON เป็นเสมอสตริง ตัวอักษรของวัตถุไม่ใช่สตริง คำว่า "ออบเจ็กต์ JSON" ไม่สมเหตุสมผลเพราะบางอย่างไม่สามารถเป็นทั้ง "JSON" - สตริงและ "อ็อบเจกต์" - ไม่ใช่สตริง
nnnnnn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.