Come posso accedere a un oggetto JavaScript che ha spazi nella chiave dell'oggetto?


112

Ho un oggetto JavaScript che assomiglia a questo:

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

Posso accedere alle proprietà di cartoonusare facilmente myTextOptions.cartoon.comico qualsiasi altra cosa. Tuttavia, non sono stato in grado di ottenere la sintassi giusta per l'accesso kid. Ho provato quanto segue senza fortuna:

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

In Google Chrome, se vai a ispezionare l'elemento e poi passi con il mouse sui set di dati del file json, ogni singolo set di dati avrà un suggerimento che mostra il suo percorso e ti dà anche la possibilità di copiare il percorso negli appunti. Solo un FYI.
Simon Suh

Bella risposta. Ma l'ultima opzione non ha funzionato per me.
Daniel Bandeira,

altro ... Quando digito myTextOptions.character% 20n.kid restituisce "NaN". L'ultimo nome della proprietà (ragazzo) non ha importanza, dovrebbe essere un altro. Sto usando FireFox Quantum 8.3.0esr (64 bit) su Debian 9
Daniel Bandeira

Risposte:


231

Usa ECMAscripts "notazione parentesi":

myTextOptions[ 'character names' ].kid;

Puoi usare quella notazione in entrambi i modi, leggendo e scrivendo.

Per maggiori informazioni leggi qui:


2
Julio menziona nell'OP che aveva già provato a usare myTextOptions.["character names"].kid- per completezza di questa domanda, mi chiedevo perché non ha funzionato?
James_F

7
@James_F Perché ha anche usato dot notationsimultaneamente. Deve essere presente una sola direttiva di accesso.
jAndy

2
oh, sì, scusa - stavo cercando così bene che non ho visto il punto in più prima della parentesi! - grazie
James_F

Qualcuno sa se è una buona o cattiva pratica usare gli spazi nelle chiavi degli oggetti?
Juan P. Ortiz

1
@ JuanP.Ortiz, Questa non è una buona pratica se stai usando un dattiloscritto, perderai il controllo di compilazione del dattiloscritto.
Rosdi Kasim

4

È inoltre possibile accedere alle proprietà degli oggetti JavaScript o impostarle utilizzando una notazione tra parentesi (per maggiori dettagli vedere le funzioni di accesso alle proprietà ). Gli oggetti sono talvolta chiamati array associativi poiché ogni proprietà è associata a un valore stringa che può essere utilizzato per accedervi. Quindi, ad esempio, potresti accedere alle proprietà dell'oggetto myCar come segue:

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

Per ulteriori informazioni, continua a leggere Lavorare con oggetti JS .

Quindi nel tuo caso lo è myTextOptions['character names'].kid;


2

Possiamo farlo anche:

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

Questo è utile quando abbiamo chiavi consecutive che consistono di spazio.


0

Lasciami condividere la mia soluzione qui sto usando VueJs con script di tipo.

Ho seguito json per analizzare e visualizzare nell'interfaccia utente

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

Ho creato il seguente modello interferire in Typescript

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

Ho chiamato l'API come:

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

Utilizzato in JSX come:

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

Lo stesso può funzionare anche in React e Angular.


0

usa questo codice

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


Al punto e succinto, ma i nuovi utenti di js potrebbero non capire la logica alla base della domanda.
Grasshopper
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.