ฉันจะเข้าถึงวัตถุ JavaScript ที่มีช่องว่างในคีย์ของวัตถุได้อย่างไร


113

ฉันมีวัตถุ JavaScript ที่มีลักษณะดังนี้:

var myTextOptions = {
  'cartoon': {
     comic: 'Calvin & Hobbes',
     published: '1993'
  },
  'character names': {
    kid: 'Calvin',
    tiger: 'Hobbes'
  }
}

ฉันสามารถเข้าถึงคุณสมบัติของการcartoonใช้งานได้อย่างง่ายดายmyTextOptions.cartoon.comicหรืออะไรก็ตาม อย่างไรก็ตามฉันไม่สามารถรับไวยากรณ์ที่ถูกต้องสำหรับการเข้าถึงkidได้ ฉันได้ลองทำสิ่งต่อไปนี้โดยไม่มีโชค:

myTextOptions.character names.kid
myTextOptions."character names".kid
myTextOptions.character\ names.kid
myTextOptions.'character names'.kid
myTextOptions.["character names"].kid
myTextOptions.character%20names.kid

ใน Google Chrome หากคุณไปตรวจสอบองค์ประกอบแล้ววางเมาส์เหนือชุดข้อมูลไฟล์ json ชุดข้อมูลแต่ละชุดจะมีคำแนะนำเครื่องมือปรากฏขึ้นเพื่อแสดงเส้นทางของมันและยังให้คุณมีตัวเลือกในการคัดลอกเส้นทางไปยังคลิปบอร์ดของคุณ แค่ FYI
Simon Suh

คำตอบที่ดี แต่ตัวเลือกสุดท้ายไม่ได้ผลกับฉัน
Daniel Bandeira

เพิ่มเติม ... เมื่อฉันพิมพ์ myTextOptions.character% 20n.kid จะส่งกลับ 'NaN' นามสกุลทรัพย์สิน (เด็ก) ไม่สำคัญควรเป็นอย่างอื่น ฉันใช้ FireFox Quantum 8.3.0esr (64-bits) บน Debian 9
Daniel Bandeira

คำตอบ:


231

ใช้ ECMAscripts "bracket notation":

myTextOptions[ 'character names' ].kid;

คุณสามารถใช้สัญกรณ์นั้นได้ทั้งการอ่านและการเขียน

สำหรับข้อมูลเพิ่มเติมอ่านได้ที่นี่:


2
julio กล่าวไว้ใน OP ว่าเขาได้ลองใช้แล้วmyTextOptions.["character names"].kid- เพื่อความสมบูรณ์ของคำถามนี้ฉันสงสัยว่าทำไมถึงไม่ได้ผล?
James_F

7
@James_F เพราะเขาใช้dot notationพร้อมกันด้วย ต้องมีคำสั่ง accessor เพียงหนึ่งคำสั่ง
jAndy

2
โอ้ใช่ขอโทษ - ดูยากมากเลยไม่เห็นจุดพิเศษก่อนวงเล็บ! - ขอบคุณ
James_F

มีใครรู้บ้างว่าการใช้ช่องว่างในคีย์ออบเจ็กต์เป็นวิธีปฏิบัติที่ดีหรือไม่ดี
Juan P. Ortiz

1
@ JuanP.Ortiz นี่ไม่ใช่แนวปฏิบัติที่ดีหากคุณใช้ typescript คุณจะสูญเสียการตรวจสอบการคอมไพล์ typescript
Rosdi Kasim

4

คุณสมบัติของอ็อบเจ็กต์ JavaScript ยังสามารถเข้าถึงหรือตั้งค่าได้โดยใช้เครื่องหมายวงเล็บ (สำหรับรายละเอียดเพิ่มเติมโปรดดูตัวเข้าถึงคุณสมบัติ ) บางครั้งอ็อบเจ็กต์ถูกเรียกว่า Associative arrays เนื่องจากแต่ละคุณสมบัติมีความเกี่ยวข้องกับค่าสตริงที่สามารถใช้เพื่อเข้าถึงได้ ตัวอย่างเช่นคุณสามารถเข้าถึงคุณสมบัติของวัตถุ myCar ได้ดังนี้:

myCar['make'] = 'Ford';
myCar['model'] = 'Mustang';
myCar['year'] = 1969;

สำหรับข้อมูลเพิ่มเติมอ่านในที่ทำงานกับ JS วัตถุ

ดังนั้นในกรณีของคุณก็คือ myTextOptions['character names'].kid;


2

เราสามารถทำได้โดย -

myTextOptions[ 'character names' ]['kid'];

สิ่งนี้มีประโยชน์เมื่อเรามีคีย์ที่ต่อเนื่องกันซึ่งประกอบด้วยช่องว่าง


0

ให้ฉันแบ่งปันวิธีแก้ปัญหาของฉันที่นี่ฉันใช้ VueJs กับสคริปต์ประเภท

ฉันติดตาม json เพื่อแยกวิเคราะห์และแสดงใน UI

 {
    "Brand": "MAMA",
    "Variety": "Instant Noodles Coconut Milk Flavour",
    "Style": "Pack",
    "Country": "Myanmar",
    "Stars": 5,
    "Top Ten": "2016 #10"
  },

ฉันได้สร้างแบบจำลองต่อไปนี้รบกวนใน typescript

export interface Resto {
    Brand: string;
    Variety: string;
    Style: string;
    Country: string;
    Stars: any;
    Top_Ten: string;
    }

ฉันเรียก API ว่า:

   public async getListOfRestos() {
    return (await fetch(
      `http://starlord.hackerearth.com/TopRamen`,
      {
        method: "get",
        credentials: "include",
        headers: {
          "Content-Type": "application/json",
        },
        body: undefined
      }
    )) as IFetchResponse<Resto[]>;
  } 

ใช้ใน JSX เช่น:

 <div class="parent" v-for="(x,i) in listOfRestos" :key="i">
      <div>{{x.Brand}}</div>
      <div>{{x.Variety}}</div>
      <div>{{x.Style}}</div>
      <div>{{x.Country}}</div>
      <div>{{x.Stars}}</div>
      <div>{{x['Top Ten']}}</div>
  </div>

เดียวกันยังสามารถทำงานใน React และ Angular


0

ใช้รหัสนี้

myTextOptions.["character names"]["kid"];


ตรงประเด็นและยอมจำนน แต่ผู้ใช้ js ใหม่อาจไม่เข้าใจเหตุผลที่อยู่เบื้องหลังคำถาม
Grasshopper
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.