Как я могу получить доступ к объекту JavaScript, в ключе которого есть пробелы?

113

У меня есть объект JavaScript, который выглядит примерно так:

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

Я могу получить доступ к свойствам cartooneasy using myTextOptions.cartoon.comicили чему-то еще. Однако мне не удалось получить правильный синтаксис для доступа kid. Я безуспешно пробовал следующее:

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
источник
В Google Chrome, если вы перейдете к проверке элемента, а затем наведете курсор на наборы данных файла json, для каждого отдельного набора данных появится всплывающая подсказка, показывающая его путь, а также возможность скопировать путь в буфер обмена. Просто к вашему сведению.
Simon Suh
Отличный ответ. Но последний вариант мне не подошел.
Даниэль Бандейра
подробнее ... Когда я набираю myTextOptions.character,% 20n.kid возвращает "NaN". Последнее название свойства (ребенок) значения не имеет, должно быть любое другое. Я использую FireFox Quantum 8.3.0esr (64-бит) на Debian 9
Даниэль Бандейра

Ответы:

231

Используйте "обозначение скобок" ECMAscripts:

myTextOptions[ 'character names' ].kid;

Вы можете использовать эту нотацию как для чтения, так и для письма.

Подробнее читайте здесь:

JANDY
источник
2
Хулио упоминает в OP, что он уже пытался использовать myTextOptions.["character names"].kid- для полноты этого вопроса мне было интересно, почему это не сработало?
James_F
7
@James_F Потому что он одновременно использовал dot notation. Должна быть только одна директива аксессора.
jAndy 07
2
о, да, извините - так пристально смотрел, что не увидел лишней точки перед скобкой! - спасибо
James_F
Кто-нибудь знает, хорошая или плохая практика - использовать пробелы в ключах объектов?
Хуан П. Ортис
1
@ JuanP.Ortiz, это не очень хорошая практика, если вы используете машинописный текст, вы потеряете проверку компиляции машинописного текста.
Росди Касим
4

К свойствам объектов JavaScript также можно получить доступ или задать их с помощью скобок (подробнее см. Аксессоры свойств ). Объекты иногда называют ассоциативными массивами, поскольку каждое свойство связано со строковым значением, которое может использоваться для доступа к нему. Так, например, вы можете получить доступ к свойствам объекта myCar следующим образом:

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

Подробнее читайте в разделе Работа с объектами JS .

Так что в вашем случае это myTextOptions['character names'].kid;

Ахмад Авайс
источник
2

Мы также можем сделать это:

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

Это полезно, когда у нас есть последовательные ключи, состоящие из пробелов.

Шубхам А.К.
источник
0

Позвольте мне поделиться своим решением здесь. Я использую VueJ с типом script.

Я получил следующий json для анализа и отображения в пользовательском интерфейсе

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

Я создал следующую модель вмешательства в Typescript

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

Я назвал API так:

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

Используется в JSX как:

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

То же самое может работать в React и Angular.

Викас Гупта
источник
0

используйте этот код

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

тамалсунгумо
источник
По сути и кратко, но новые пользователи js могут не понять причины вопроса.
Grasshopper