Comment puis-je accéder à un objet JavaScript qui a des espaces dans la clé de l'objet?

112

J'ai un objet JavaScript qui ressemble à ceci:

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

Je peux accéder aux propriétés de l' cartoonutilisation facile myTextOptions.cartoon.comicou autre. Cependant, je n'ai pas pu obtenir la syntaxe correcte pour accéder kid. J'ai essayé ce qui suit sans succès:

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
la source
Dans Google Chrome, si vous inspectez l'élément, puis passez la souris sur les ensembles de données du fichier json, chaque ensemble de données individuel aura une info-bulle indiquant son chemin et vous donne également la possibilité de copier le chemin dans votre presse-papiers. Juste un FYI.
Simon Suh
Très bonne réponse. Mais la dernière option n'a pas fonctionné pour moi.
Daniel Bandeira
plus ... Lorsque je tape myTextOptions.character% 20n.kid renvoie 'NaN'. Le dernier nom de propriété (enfant) n'a pas d'importance, devrait être un autre. J'utilise FireFox Quantum 8.3.0esr (64 bits) sur Debian 9
Daniel Bandeira

Réponses:

231

Utilisez la «notation entre crochets» ECMAscripts:

myTextOptions[ 'character names' ].kid;

Vous pouvez utiliser cette notation dans les deux sens, en lecture et en écriture.

Pour plus d'informations, lisez ici:

jAndy
la source
2
julio mentionne dans l'OP qu'il avait déjà essayé d'utiliser myTextOptions.["character names"].kid- pour compléter cette question, je me demandais pourquoi cela n'a pas fonctionné?
James_F
7
@James_F Parce qu'il a également utilisé dot notationsimultanément. Il ne doit y avoir qu'une seule directive d'accesseur.
jAndy
2
oh, oui, désolé - je cherchais si fort que je n'ai pas vu le point supplémentaire avant le support! - merci
James_F
Est-ce que quelqu'un sait si c'est une bonne ou une mauvaise pratique d'utiliser des espaces dans les clés d'objet?
Juan P. Ortiz
1
@ JuanP.Ortiz, Ce n'est pas une bonne pratique si vous utilisez du dactylographié, vous perdrez le contrôle de compilation du dactylographié.
Rosdi Kasim
4

Les propriétés des objets JavaScript peuvent également être consultées ou définies à l'aide d'une notation entre crochets (pour plus de détails, voir les accesseurs de propriété ). Les objets sont parfois appelés tableaux associatifs car chaque propriété est associée à une valeur de chaîne qui peut être utilisée pour y accéder. Ainsi, par exemple, vous pouvez accéder aux propriétés de l'objet myCar comme suit:

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

Pour plus d'informations, lisez la rubrique Utilisation d'objets JS .

Donc dans votre cas c'est myTextOptions['character names'].kid;

Ahmad Awais
la source
2

Nous pouvons également le faire en -

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

Ceci est utile lorsque nous avons des clés consécutives constituées d'espace.

Shubham AK
la source
0

Permettez-moi de partager ma solution ici, j'utilise VueJs avec un script de type.

J'ai suivi json pour analyser et afficher dans l'interface utilisateur

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

J'ai créé le modèle suivant interférer dans Typescript

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

J'ai appelé l'API comme suit:

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

Utilisé dans JSX comme:

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

La même chose peut également fonctionner dans React et Angular.

Vikas Gupta
la source
0

utiliser ce code

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

therealsungumo
la source
Au point et succinct, mais les nouveaux utilisateurs js pourraient ne pas comprendre la raison d'être de la question.
Grasshopper