¿Cómo puedo acceder a un objeto JavaScript que tiene espacios en la clave del objeto?

112

Tengo un objeto de JavaScript que se parece a esto:

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

Puedo acceder a las propiedades de cartoonuso fácil myTextOptions.cartoon.comico lo que sea. Sin embargo, no he podido obtener la sintaxis correcta para acceder kid. Intenté lo siguiente sin suerte:

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
fuente
En Google Chrome, si va a inspeccionar el elemento y luego se desplaza sobre los conjuntos de datos del archivo json, cada conjunto de datos individual tendrá una información sobre herramientas que muestra su ruta y también le da la opción de copiar la ruta en su portapapeles. Solo un FYI.
Simon Suh
Gran respuesta. Pero la última opción no me ha funcionado.
Daniel Bandeira
más ... Cuando escribo myTextOptions.character% 20n.kid devuelve 'NaN'. El último nombre de la propiedad (niño) no importa, debería ser cualquier otro. Estoy usando FireFox Quantum 8.3.0esr (64 bits) en Debian 9
Daniel Bandeira

Respuestas:

231

Utilice ECMAscripts "notación entre corchetes":

myTextOptions[ 'character names' ].kid;

Puede usar esa notación de cualquier manera, leyendo y escribiendo.

Para obtener más información, lea aquí:

jAndy
fuente
2
julio menciona en el OP que ya había intentado usar myTextOptions.["character names"].kid; para completar esta pregunta, me preguntaba por qué no funcionó.
James_F
7
@James_F Porque también usó dot notationsimultáneamente. Solo debe haber una directiva de acceso.
jAndy
2
oh, sí, lo siento - ¡miraba con tanta atención que no vi el punto extra antes del corchete! - gracias
James_F
¿Alguien sabe si es una buena o una mala práctica utilizar espacios en las claves de los objetos?
Juan P. Ortiz
1
@ JuanP.Ortiz, esta no es una buena práctica si está utilizando mecanografiado, perderá la verificación de compilación del mecanografiado.
Rosdi Kasim
4

También se puede acceder a las propiedades de los objetos JavaScript o establecerlas mediante una notación entre corchetes (para obtener más detalles, consulte los descriptores de acceso a las propiedades ). Los objetos a veces se denominan matrices asociativas ya que cada propiedad está asociada con un valor de cadena que se puede usar para acceder a ella. Entonces, por ejemplo, podría acceder a las propiedades del objeto myCar de la siguiente manera:

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

Para obtener más información, siga leyendo en Trabajar con objetos JS .

Entonces en tu caso es myTextOptions['character names'].kid;

Ahmad Awais
fuente
2

También podemos hacer esto:

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

Esto es útil cuando tenemos claves consecutivas que constan de espacio.

Shubham AK
fuente
0

Permítanme compartir mi solución aquí. Estoy usando VueJs con script de tipo.

Tengo el siguiente json para analizar y mostrar en la interfaz de usuario

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

He creado el siguiente modelo que interfiere en TypeScript

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

He llamado a la API como:

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

Usado en JSX como:

 <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 mismo también puede funcionar en React y Angular.

Vikas Gupta
fuente
0

usa este código

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

therealsungumo
fuente
Al grano y sucinto, pero los nuevos usuarios de js pueden no entender la razón detrás de la pregunta.
Saltamontes