Nesnenin anahtarında boşluklar olan bir JavaScript nesnesine nasıl erişebilirim?


112

Şuna benzeyen bir JavaScript nesnem var:

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

cartoonKullanarak myTextOptions.cartoon.comicya da ne olursa olsun özelliklerine kolayca erişebilirim . Ancak, söz dizimini erişim için doğru bir şekilde alamadım kid. Şanssız olarak şunu denedim:

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'da, öğeyi incelemeye gidip ardından json dosyası veri kümelerinin üzerine gelirseniz, her bir veri kümesinin yolunu gösteren bir araç ipucu görünür ve ayrıca size yolu panonuza kopyalama seçeneği sunar. Sadece bir Bilginize.
Simon Suh

Mükemmel cevap. Ama son seçenek benim için işe yaramadı.
Daniel Bandeira

devamı ... myTextOptions.character% 20n.kid yazdığımda 'NaN' döndürüyor. Soyadı (çocuk) önemli değildir, başka biri olmalıdır. Debian 9'da FireFox Quantum 8.3.0esr (64-bit) kullanıyorum
Daniel Bandeira

Yanıtlar:


231

ECMAscripts "köşeli parantez gösterimi" kullanın:

myTextOptions[ 'character names' ].kid;

Bu notasyonu her iki şekilde de kullanabilirsiniz, okuma ve yazma.

Daha fazla bilgi için buradan okuyun:


2
julio, OP'de zaten kullanmayı denediğinden bahseder myTextOptions.["character names"].kid- bu sorunun bütünlüğü için, bunun neden işe yaramadığını merak ediyordum.
James_F

7
@James_F Çünkü o da dot notationaynı anda kullandı . Yalnızca bir erişimci yönergesi olmalıdır.
jAndy

2
oh, evet, üzgünüm - o kadar sert görünüyordu ki köşeli ayraçtan önce fazladan nokta görmedim! - teşekkürler
James_F

Nesne anahtarlarındaki boşlukların iyi mi yoksa kötü bir uygulama mı olduğunu bilen var mı?
Juan P. Ortiz

1
@ JuanP.Ortiz, Daktilo kullanıyorsanız bu iyi bir uygulama değildir, daktilo derleme kontrolünü kaybedersiniz.
Rosdi Kasim

4

JavaScript nesnelerinin özelliklerine de bir parantez gösterimi kullanılarak erişilebilir veya ayarlanabilir (daha fazla ayrıntı için, özellik erişimcilerine bakın ). Her özellik, ona erişmek için kullanılabilecek bir dize değeriyle ilişkilendirildiğinden, nesnelere bazen ilişkilendirilebilir diziler denir. Dolayısıyla, örneğin, myCar nesnesinin özelliklerine aşağıdaki gibi erişebilirsiniz:

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

Daha fazla bilgi için JS Nesneleriyle Çalışma sayfasını okuyun .

Yani senin durumunda myTextOptions['character names'].kid;


2

Bunu şu şekilde de yapabiliriz -

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

Bu, boşluktan oluşan ardışık anahtarlarımız olduğunda kullanışlıdır.


0

Çözümümü burada paylaşmama izin verin, VueJ'leri tip komut dosyası ile kullanıyorum.

UI'de ayrıştırmak ve görüntülemek için json'u takip ettim

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

Typescript'e müdahale etmek için aşağıdaki modeli oluşturdum

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

API'yi şu şekilde çağırdım:

   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'de şöyle kullanılır:

 <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>

Aynı şey React ve Angular'da da çalışabilir.


0

bu kodu kullan

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


Temel ve öz, ancak yeni js kullanıcıları sorunun arkasındaki mantığı anlamayabilir.
Çekirge
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.