Como posso acessar um objeto JavaScript que contém espaços na chave do objeto?

112

Eu tenho um objeto JavaScript que se parece com isto:

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

Posso acessar as propriedades de cartoonusar facilmente myTextOptions.cartoon.comicou o que quer. No entanto, não consegui obter a sintaxe correta para acessar kid. Tentei o seguinte sem sorte:

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
fonte
No Google Chrome, se você for inspecionar o elemento e, em seguida, passar o mouse sobre os conjuntos de dados do arquivo json, cada conjunto de dados individual terá uma dica de ferramenta exibida mostrando o caminho e também oferece a opção de copiar o caminho para a área de transferência. Apenas um FYI.
Simon Suh
Ótima resposta. Mas a última opção não funcionou para mim.
Daniel Bandeira
mais ... Quando eu digito myTextOptions.character% 20n.kid retorna 'NaN'. O último nome da propriedade (criança) não importa, deve ser qualquer outro. Estou usando FireFox Quantum 8.3.0esr (64 bits) no Debian 9
Daniel Bandeira

Respostas:

231

Use ECMAscripts "notação de colchetes":

myTextOptions[ 'character names' ].kid;

Você pode usar essa notação de qualquer maneira, lendo e escrevendo.

Para mais informações, leia aqui:

Andy
fonte
2
julio menciona no OP que ele já havia tentado usar myTextOptions.["character names"].kid- para completar esta pergunta, eu queria saber por que não funcionou?
James_F
7
@James_F Porque ele também usou o dot notationsimultaneamente. Deve haver apenas uma diretiva de acessador.
jAndy
2
oh, sim, desculpe - estava procurando tanto que não vi o ponto extra antes do colchete! - obrigado
James_F
Alguém sabe se é uma boa ou má prática usar espaços nas chaves dos objetos?
Juan P. Ortiz
1
@ JuanP.Ortiz, Esta não é uma boa prática se você estiver usando o texto digitado, você perderá a verificação de compilação do texto digitado.
Rosdi Kasim
4

Propriedades de objetos JavaScript também podem ser acessadas ou definidas usando uma notação de colchetes (para obter mais detalhes, consulte acessadores de propriedade ). Os objetos às vezes são chamados de matrizes associativas, pois cada propriedade está associada a um valor de string que pode ser usado para acessá-la. Assim, por exemplo, você pode acessar as propriedades do objeto myCar da seguinte maneira:

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

Para mais informações, continue lendo em Working with JS Objects .

Então, no seu caso é myTextOptions['character names'].kid;

Ahmad Awais
fonte
2

Também podemos fazer isso -

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

Isso é útil quando temos chaves consecutivas que consistem em espaço.

Shubham AK
fonte
0

Deixe-me compartilhar minha solução aqui, estou usando VueJs com script de tipo.

Eu comecei a seguir json para analisar e exibir na IU

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

Eu criei o seguinte modelo que interfere no Typescript

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

Eu chamei a 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 em 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>

O mesmo também pode funcionar em React e Angular.

Vikas Gupta
fonte
0

use este código

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

Therealsungumo
fonte
Direto e sucinto, mas novos usuários do js podem não entender a lógica por trás da pergunta.
Grasshopper