¿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

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


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;


2

También podemos hacer esto:

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

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


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.


0

usa este código

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


Al grano y sucinto, pero los nuevos usuarios de js pueden no entender la razón detrás de la pregunta.
— Saltamontes
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.