[JavaScript] 2중 객체(중첩된 객체) 접근

Lpla

·

2021. 2. 8. 22:21

반응형

2중 객체(중첩된 객체)

실무에서 객체(Object) 안에 객체를 만들고 반복문을 돌려야 하는 일이 생겼다.

아래 예시 코드를 보자.

let 팝업 = {
  첫번째: {
    tab_name: '<div> 1 </div>',
    tab_bg: '#2D3E52',
    link: '',
    end_date: '2021-02-28'
  },
  두번째: {
    tab_name: '<div> 2 </div>',
    tab_bg: '#F1A5CC',
    link: 'www.naver.com',
    end_date: '2020-01-01'
  },
  세번째: {
    tab_name: '<div> 3 </div>',
    tab_bg: '#0060AC',
    link: '',
    end_date: '2020-08-31'
  },
  네번째: {
    tab_name: '<div> 4 </div>',
    tab_bg: '#FF540F',
    link: 'www.daum.net',
    end_date: '2021-03-30'
  },
  다섯번째: {
    tab_name: '<div> 5 </div>',
    tab_bg: '#FF7F7E',
    link: '',
    end_date: '2022-01-01'
  }
}

위 코드가 효율적인지 아닌지는 둘째치고 이러한 코드에 접근하는 상황이라고 가정하자.

for문을 돌린다고 할 때 어떻게 key와 value에 접근할 것인지 문제가 된다.

배열을 합치거나 하는 몇 가지 방법들이 있긴 하겠지만 나는 이 상태 그대로 접근하고 싶었다.

 

typeof(팝업); // "Object"
typeof(팝업.첫번째) // "Object"

팝업과 팝업.첫번째는 모두 객체이다.

그렇다면 tab_name을 선택하려면 어떻게 해야 할까?

 

팝업.첫번째.tab_name
// "<div> 1 </div>"

쉽다. 가장 단순하게 생각나는대로 적으면 된다.

그렇다면 [0] 과 같은 숫자 형태로 접근하려면 어떻게 해야 할까?

 

팝업.첫번째
// {tab_name: "<div> 1 </div>", tab_bg: "#2D3E52", link: "", end_date: "2021-02-28"}

팝업.첫번째[0]
// undefined

Object.keys(팝업.첫번째)[0]
// "tab_name"

Object.values(팝업.첫번째)[0]
// "<div> 1 </div>"

일반적인 팝업.첫번째[0] 은 안되고 Object.keys 혹은 Object.values 를 사용해야 한다.

하지만 이대로 반복문을 돌릴 수는 없다.

'두번째', '세번째' 역시 반복문으로 접근할 수 있어야 한다.

팝업의 첫번째 객체인 '첫번째' 를 어떻게 숫자로 나타낼 수 있을까?

 

 

Object.keys(팝업.첫번째)[0] 의 결과 "tab_name" 을 얻을 수 있었다.

그리고 위에서 팝업.첫번째.tab_name 의 결과 "<div> 1 </div> 가 나왔으므로 tab_name 자리에 Object.keys(팝업.첫번째)[0] 을 쓰면 되지 않을까?

 

팝업.첫번째.Object.keys(팝업.첫번째)[0]
// Uncaught TypeError: Cannot read property 'keys' of undefined

 

하지만 에러가 발생했다.

그 이유는 Object.keys(팝업.첫번째)[0] 의 타입이 string이기 때문이다.

실제 tab_name은 key 이다.

typeof(Object.keys(팝업.첫번째)[0]);
// "string"

 

다른 방법으로 접근하는 것이 필요했다.

Object.values 말고 Object['value'] 로 접근했다.

팝업.첫번째['tab_name']
// "<div> 1 </div>"

Object.keys(팝업)[0]
// "첫번째"

팝업[Object.keys(팝업)[0]].tab_name
// "<div> 1 </div>"

 

복잡하지만 두 가지 방식을 모두 사용해서 원하는 결과값을 얻을 수 있었다.

이제 반복문을 돌릴 수 있다.

 

for (let i = 0; i < Object.keys(팝업).length; i++ ) {
  console.log(팝업[Object.keys(팝업)[i]].tab_name);
}

// <div> 1 </div>
// <div> 2 </div>
// <div> 3 </div>
// <div> 4 </div>
// <div> 5 </div>
반응형