Wie kann ich auf ein JavaScript-Objekt zugreifen, dessen Schlüssel im Objektschlüssel Leerzeichen enthalten?

112

Ich habe ein JavaScript-Objekt, das ungefähr so ​​aussieht:

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

Ich kann auf die Eigenschaften der cartooneinfachen Verwendung myTextOptions.cartoon.comicoder was auch immer zugreifen . Ich konnte jedoch nicht die richtige Syntax für den Zugriff finden kid. Ich habe Folgendes ohne Glück versucht:

myTextOptions.character names.kid
myTextOptions."character names".kid
myTextOptions.character\ names.kid
myTextOptions.'character names'.kid
myTextOptions.["character names"].kid
myTextOptions.character%20names.kid
julio
quelle
Wenn Sie in Google Chrome das Element überprüfen und dann mit der Maus über die JSON-Dateidatensätze fahren, wird für jeden einzelnen Datensatz ein Tooltip mit dem Pfad angezeigt. Außerdem können Sie den Pfad in Ihre Zwischenablage kopieren. Nur zu Ihrer Information.
Simon Suh
Gute Antwort. Aber die letzte Option hat bei mir nicht funktioniert.
Daniel Bandeira
mehr ... Wenn ich myTextOptions.character% 20n.kid eingebe, wird 'NaN' zurückgegeben. Der letzte Eigenschaftsname (Kind) spielt keine Rolle, sollte ein anderer sein. Ich verwende FireFox Quantum 8.3.0esr (64-Bit) unter Debian 9
Daniel Bandeira

Antworten:

231

Verwenden Sie ECMAscripts "Klammer-Notation":

myTextOptions[ 'character names' ].kid;

Sie können diese Notation so oder so verwenden, lesen und schreiben.

Weitere Informationen finden Sie hier:

jAndy
quelle
2
julio erwähnt im OP, dass er es bereits versucht hatte myTextOptions.["character names"].kid- der Vollständigkeit halber habe ich mich gefragt, warum das nicht funktioniert hat?
James_F
7
@ James_F Weil er das auch dot notationgleichzeitig benutzt hat. Es darf nur eine Accessor-Direktive geben.
jAndy
2
oh ja, sorry - sah so genau aus, dass ich den zusätzlichen Punkt vor der Klammer nicht sah! - Danke
James_F
Weiß jemand, ob es eine gute oder eine schlechte Praxis ist, Leerzeichen in Objektschlüsseln zu verwenden?
Juan P. Ortiz
1
@ JuanP.Ortiz, Dies ist keine gute Vorgehensweise, wenn Sie Typoskript verwenden. Sie verlieren die Kompilierungsprüfung für Typoskript.
Rosdi Kasim
4

Auf Eigenschaften von JavaScript-Objekten kann auch mit einer Klammer-Notation zugegriffen oder festgelegt werden (weitere Informationen finden Sie unter Eigenschaften-Accessoren ). Objekte werden manchmal als assoziative Arrays bezeichnet, da jeder Eigenschaft ein Zeichenfolgenwert zugeordnet ist, mit dem auf sie zugegriffen werden kann. So können Sie beispielsweise wie folgt auf die Eigenschaften des myCar-Objekts zugreifen:

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

Weitere Informationen finden Sie unter Arbeiten mit JS-Objekten .

Also in deinem Fall ist es myTextOptions['character names'].kid;

Ahmad Awais
quelle
2

Wir können dies auch tun, indem wir -

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

Dies ist nützlich, wenn wir aufeinanderfolgende Schlüssel haben, die aus Leerzeichen bestehen.

Shubham AK
quelle
0

Lassen Sie mich hier meine Lösung teilen. Ich verwende VueJs mit Typenskript.

Ich habe json gefolgt, um es zu analysieren und in der Benutzeroberfläche anzuzeigen

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

Ich habe das folgende Modell Interferenz in Typescript erstellt

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

Ich habe die API wie folgt aufgerufen:

   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[]>;
  } 

Wird in JSX verwendet wie:

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

Gleiches kann auch in React und Angular funktionieren.

Vikas Gupta
quelle
0

Verwenden Sie diesen Code

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

therealsungumo
quelle
Auf den Punkt gebracht, aber neue js-Benutzer verstehen möglicherweise nicht die Gründe für die Frage.
Heuschrecke