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

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:


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;


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.


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.


0

utiliser ce code

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


Au point et succinct, mais les nouveaux utilisateurs js pourraient ne pas comprendre la raison d'être de la question.
— Grasshopper
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.