• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

filter 영상에서 질문이 있습니다

23.09.29 20:18 작성 조회수 146

0

const selectCategory = (e) => {
  if (!myProducts) {
    alert('상품 목록을 불러와주세요.');
  } else {
    const {selectedIndex} = e.target.options; // 구조분해할당 문법
    const {value} = e.target.options[selectedIndex];
  }
}

여기서 구조분해 할당 문법이 적용이 되었는데 잘 이해가 가지 않아서 질문 드립니다.

 

1) 구조분해 할당은 배열/객체에서 적용이 가능한 것으로 알고 있는데요, console.log(e.target.options) 를 찍어보면 Array 가 아닌 "HTMLOptionsCollection" 으로 반환이 되는데 어떻게 객체로 되어서 문법이 가능한지 궁금합니다.
=> 보니까.. 첫 Prototype 에만 HTMLOptionsCollection 으로 반환이 되고, Prototype 에서 계속 타고 내려갈수록 결국 "Object" 에서 파생된거라 가능한건가요?


2) option 의 value 값을 어떻게 한 번에 받아올 수가 있는지 궁금합니다.
부가 설명을 드리자면, e.target.options 를 찍으면 많은 정보들(ex. tagName, className, value 등등)이 나오는데요. 원래대로라면 e.target.options[selectedIndex].value 처럼 접근해야 값을 가져올 수 있는건데, 여기서는 const {value} = e.target.options[selectedIndex] 로 한 번에 가져오는게 궁금합니다.
=> 해당 부분을 콘솔로 찍어보았을 때 아래처럼 HTML 태그를 가져오는 건 확인했습니다.
<option value="life">생활용품</option>
여기서 구조분해 할당 문법 적용 시 태그에 선언되어 있는 attribute 값이 자동으로 적용 이 되어 가져오는 건지, 아니면 문법적으로 뭔가 고정된 식 이 있는건지 궁금합니다.
아래는 제가 const {value} = e.target.options[selectedIndex]; 코드로 적고 콘솔로 찍었을 때 반환하는 값을 테스트 해 본 결과로 공유 드립니다.

<select name="category" class="select">
  <option value="life">생활용품</option> <!-- "life" 반환 -->
  <option data-id="test">생활용품</option> <!-- "생활용품" 반환 -->
  <option data-id="test" value="life">생활용품</option> <!-- "life" 반환 -->
</select>

 

 

 

답변 1

답변을 작성해보세요.

1

티라미수님 안녕하세요.


A1

먼저 HTMLCollection은 유사 배열 객체이고, Iterable입니다.

console.log(typeof e.target.options);

따라서 정확히 배열 객체는 아니나, 배열 객체와 같은 방식으로 접근 (인덱스를 사용해 접근하는 등)하거나 반복할 수 있고, 구조분해할당을 사용할 수 있습니다. 하지만 유사 배열 객체니까 map 같은 건 바로 사용할 수 없습니다.


A2

두 번째 질문은 잘 이해가 가지 않습니다. 우선 올바르게 사용하고 계십니다…! 혹시 구조분해할당을 헷갈리신 것은 아닐까요? ‘한 번에 가져온다’라고 표현하시는 부분에 구조분해할당이 적용되어 있습니다.

console.dir(e.target.options[selectedIndex]);

하나의 옵션 객체를 열어서 그 안에 구조를 보시면, 이 안에 value가 있고, 현재 그 값을 가져오려고 하고 있습니다. 즉, 객체.value를 가져오려고 하기 때문에, 이를 구조분해할당하여 바로 가져온 것입니다. (이는 selectedIndexe.target.options 객체에서 가져온 것과 같은 방법입니다.) 같은 방법으로, 만약 동일한 객체의 text 속성도 가져오고 싶다면 다음과 같이 쓸 수 있습니다.

const { value, text } = e.target.options[selectedIndex];
console.log(value, text);

연휴 잘 보내고 계신가요?
답변이 공부하시는 데 도움이 되길 바랍니다.
행복한 연휴 보내세요~

구조분해할당에 대한 의문은 이후에 바로 reduce 강의 듣고 해결 되었습니다 ㅎㅎㅎ
아래처럼 테스트 해보니 하나씩 가져올 수 있다는 걸 인지하게 되었습니다.

const { selectedIndex } = e.target.options;
const { value } = e.target.options[selectedIndex];
const { className } = e.target.options[selectedIndex];
const { dataset } = e.target.options[selectedIndex];
console.log(value, className, dataset);

구조 안의 원하는 속성 값을 바로 가져오고 싶다면 속성명과 동일하게 변수로 선언해서 가져오는 것이 가능하고 => 이 과정을 "구조분해할당" 인 것으로 이해했습니다.
다만 답변처럼 한번에 불러올 수 있는 방법도 있다는 건 처음 알게 되었습니다. ^^
제 스스로가 완전히 이해되기 전이라 질문이 좀 요상했을텐데 자세히 설명해주셔서 감사드리며,
유사배열객체도 이후에 공부해 보겠습니다. 상세한 답변 감사드립니다 !!!
연휴 잘 보내세요! 😊