Як я можу отримати доступ до об’єкта JavaScript, який має пробіли в ключі об'єкта?


112

У мене об’єкт JavaScript виглядає приблизно так:

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

Я можу отримати доступ до властивостей, cartoonлегко використовуючи 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

У Google Chrome, якщо ви перейдете на огляд елемента, а потім наведіть курсор миші на набір даних файлів json, у кожного окремого набору даних з’явиться підказка, яка показує його шлях, а також дає можливість скопіювати шлях у буфер обміну. Просто вигадка.
Simon Suh

Чудова відповідь. Але останній варіант для мене не спрацював.
Даніель Бандейра

докладніше ... Коли я набираю myTextOptions.character% 20n.kid повертає "NaN". Прізвище власності (дитина) не має значення, має бути будь-яким іншим. Я використовую FireFox Quantum 8.3.0esr (64-біт) на Debian 9
Daniel Bandeira

Відповіді:


231

Використовуйте ECMAscripts "дужки нотації":

myTextOptions[ 'character names' ].kid;

Ви можете використовувати цю нотацію будь-яким способом, читаючи та писати.

Для отримання додаткової інформації читайте тут:


2
Джуліо згадує в ОП, що він вже намагався використовувати myTextOptions.["character names"].kid- для повноти цього питання мені було цікаво, чому це не вийшло?
James_F

7
@James_F Тому що він також використовував dot notationодночасно. Повинна бути лише одна директива про доступ.
jAndy

2
о, так, вибачте - виглядав так важко, що не бачив зайвої крапки перед дужкою! - дякую
James_F

Хтось знає, чи добре це чи погано застосовувати пробіли в об’єктних клавішах?
Хуан П. Ортіз

1
@ JuanP.Ortiz, Це не є хорошою практикою, якщо ви використовуєте typecript, ви втратите чек компіляції машинопису.
Росді Касім

4

До властивостей об’єктів JavaScript також можна отримати доступ або встановити, використовуючи дужку позначення (детальніше див. Аксесуари властивостей ). Об'єкти іноді називають асоціативними масивами, оскільки кожне властивість асоціюється зі значенням рядка, яке можна використовувати для доступу до нього. Так, наприклад, ви можете отримати доступ до властивостей об'єкта myCar наступним чином:

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

Докладніше читайте у розділі Робота з об’єктами JS .

Тож у вашому випадку це так myTextOptions['character names'].kid;


2

Ми також можемо це зробити:

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

Це корисно, коли у нас є послідовні ключі, які складаються з місця.


0

Дозвольте мені поділитися своїм рішенням, тут я використовую VueJs з тип-скриптом.

Я отримав наступний 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 можуть не зрозуміти обґрунтування цього питання.
Коник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.