การใช้ตัวเลขเป็น "ดัชนี" (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.