객체 키에 공백이있는 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 크롬에서 요소를 검사 한 다음 json 파일 데이터 세트 위로 마우스를 가져 가면 각 개별 데이터 세트에는 경로를 보여주는 툴팁이 표시되며 경로를 클립 보드에 복사 할 수있는 옵션도 제공합니다. 그냥 참고로.
Simon Suh

좋은 대답입니다. 그러나 마지막 옵션은 나에게 효과가 없었습니다.
Daniel Bandeira

자세히 ... myTextOptions.character % 20n.kid를 입력하면 'NaN'이 반환됩니다. 성 (아이)은 중요하지 않으며 다른 이름이어야합니다. Debian 9에서 FireFox Quantum 8.3.0esr (64 비트)를 사용하고 있습니다
Daniel Bandeira

답변:


231

ECMAscripts "대괄호 표기법"사용 :

myTextOptions[ 'character names' ].kid;

그 표기법은 읽기와 쓰기로 사용할 수 있습니다.

자세한 내용은 여기를 참조하십시오.


2
julio는 OP에서 그가 이미 사용해 본 적이 있다고 언급 myTextOptions.["character names"].kid합니다.이 질문에 대한 완전성을 위해 왜 작동하지 않는지 궁금합니다.
James_F

7
@James_F 그는 dot notation동시에 사용했기 때문 입니다. 접근 자 지시문은 하나만 있어야합니다.
jAndy

2
아, 그래, 미안해-너무 힘들어서 브래킷 앞에 여분의 점이 보이지 않았습니다! -감사합니다
James_F 2007

누군가 객체 키에 공백을 사용하는 것이 좋은지 나쁜지 알고 있습니까?
Juan P. Ortiz

1
@ JuanP.Ortiz, 이것은 typescript를 사용하는 경우 좋은 습관이 아니며 typescript 컴파일 검사를 잃을 것입니다.
Rosdi Kasim

4

JavaScript 객체의 속성은 대괄호 표기법을 사용하여 액세스하거나 설정할 수도 있습니다 (자세한 내용은 속성 접근 자 참조 ). 각 속성은 개체에 액세스하는 데 사용할 수있는 문자열 값과 연결되어 있기 때문에 객체를 연관 배열이라고도합니다. 따라서 예를 들어 다음과 같이 myCar 객체의 속성에 액세스 할 수 있습니다.

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

자세한 내용은 Working with JS Objects를 참조하십시오 .

그래서 귀하의 경우에는 myTextOptions['character names'].kid;


2

우리는 또한 이것을 할 수 있습니다-

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

이것은 공백으로 구성된 연속 키가있을 때 유용합니다.


0

여기서 내 솔루션을 공유하겠습니다. 유형 스크립트와 함께 VueJ를 사용하고 있습니다.

UI에서 구문 분석하고 표시하기 위해 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.