고슴맨쉬
망치와 공(空)
고슴맨쉬
  • 분류 전체보기 (155)
    • 💡 UXUI (4)
      • UXUI (2)
      • UI (2)
      • UX (0)
    • 🟨 JavaScript (66)
      • 개념 (42)
      • 정리 (2)
      • 문제풀기 (프로그래머스, 코딩애플) (15)
      • 응용하여 자동화or문제해결하기 (2)
      • 기타 (5)
    • ⚛️ React (49)
      • 개념 (27)
      • 개념(Redux) (3)
      • 정리 (4)
      • 문제풀기 (코딩애플: React) (15)
    • 📘 TypeScript (10)
      • 개념 (8)
      • 문제풀기 (코딩애플) (2)
    • 🌐 HTML,CSS (18)
      • 실무에서 자주 발생한 오류들 (10)
      • 뒤늦게 알아서 뼈아픈 유용한 CSS (6)
      • 기타 자주 쓰는 CSS (2)
    • 💻 CS (8)
      • CS (5)
      • 정규표현식 (2)
      • Git,Github (1)

태그

  • CS
  • class
  • useEffect
  • 프로그래머스
  • Ajax
  • json
  • UXUI
  • redux
  • Props
  • object
  • state
  • axios
  • JavaScript
  • react
  • 오류
  • TypeScript
  • array
  • 삼항연산자
  • 코딩애플
  • CSS
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
고슴맨쉬

망치와 공(空)

🟨 JavaScript/문제풀기 (프로그래머스, 코딩애플)

Level 3 : 4 (array, object, forEach)

2023. 1. 31. 15:44

4. 바지 선택하면 array에 저장한 바지사이즈 셀렉박스 만들기

조건

바지를 선택하면 array에 입력한 데이터가 사이즈 셀렉박스에 자동으로 추가되어야 한다. 


틀린 풀이

<form class="container my-5 form-group">
  <p>상품 선택</p>
  <select class="form-select mt-2">
    <option>모자</option>
    <option>셔츠</option>
    <option>바지</option>
  </select>
  <select class="form-select form-popup mt-2 form-hide">
    <option>100</option>
  </select>
</form>
let pants = [28, 30, 32];

let selectBox = document.querySelector('.form-select');
let selectSize = document.querySelector('.form-popup');

function pantsSize() {
    if (selectBox.value == '바지') {
        selectSize.classList.remove('form-hide');

        for (i = 0; selectSize.length = pants.length; i++) {
            document.querySelectorAll('.form-popup option')[i].innerHTML = pants[i];
            selectSize.appendChild(document.createElement('option'));
        }
    } else { selectSize.classList.add('form-hide'); }
}
selectBox.addEventListener('input', pantsSize);

수치사할까 봐 올릴까 말까 고민 많이 했는데.. for문 조건식을 부등호로 했다가 빈 셀렉박스로 노출되어 등호로 바꿨더니 작동이 되어버려서 등호로 했다. 이는 당연한 건데, 등호가 선언처럼 작동하여 무한루프 조건식이 되어버린 것.


작동하는 풀이

let pants = [28, 30, 32];

let selectBox = document.querySelector('.form-select');
let selectSize = document.querySelector('.form-popup');

function pantsSize() {
    if (selectBox.value == '바지') {
        selectSize.classList.remove('form-hide');

        for (i = selectSize.length; i < pants.length; i++) {
            selectSize.appendChild(document.createElement('option'));
            document.querySelectorAll('.form-popup option')[i].innerHTML = pants[i];
        }
    } else { selectSize.classList.add('form-hide'); }
}
selectBox.addEventListener('input', pantsSize);

의문이었던 부분

왜인지 let selectSizeElement = document.querySelectorAll('.form-popup option'); 으로 option을 전역변수로 설정해 두고 for문안에  document.querySelectorAll('.form-popup option')[i]을 selectSizeElement[i]으로 주니 selectSizeElement[i]가 undefined가 나왔다. 디버깅 직접 document.querySelectorAll('.form-popup option')[i]으로 콘솔에 찍어보면 값이 제대로 나왔다. 변수 수에 할당한 값을 함수 안에서 인덱스를 주면 에러가 나는걸까?

의문 해결

document.querySelectorAll('.form-popup option')을 전역변수로 설정하니(if문 첫줄에 넣어도 똑같다) createElement로 새로운 option을 만들기 전에 읽어버려서 인덱스들이 읽어지지 않는 것이었다.

for (i = selectSize.length; i < pants.length; i++) {
    selectSize.appendChild(document.createElement('option'));
    let selectSizeElement = document.querySelectorAll('.form-popup option'); //여기
    selectSizeElement[i].innerHTML = pants[i];
}

(그래서 이건 제대로 작동한다)


forEach 버전

let pants = [28, 30, 32];

let selectBox = document.querySelector('.form-select');
let selectSize = document.querySelector('.form-popup');

function selectSizePop() {
    if (selectBox.value == '바지') {
        selectSize.classList.remove('form-hide');
        selectSize.innerHTML = '';
        
        pants.forEach(function(pantsSize){
            selectSize.insertAdjacentHTML('beforeend', `<option>${pantsSize}</option>`);
        });
    } else { selectSize.classList.add('form-hide'); }
}
selectBox.addEventListener('input', selectSizePop);

출처 : 코딩애플 https://codingapple.com/

저작자표시 비영리 동일조건 (새창열림)

'🟨 JavaScript > 문제풀기 (프로그래머스, 코딩애플)' 카테고리의 다른 글

Level 3 : 9 장바구니버튼 구현하기(localStorage, array, forEach, JSON)  (0) 2023.04.15
Level 3 : 5~8 (ajax, json, array, sort)  (0) 2023.04.13
Level 3 : 1~3 (array, object)  (0) 2023.01.31
[중요] Level 2 : 14,15(숙제 및 깨달은 점)_for, 버블링활용축약버전  (0) 2023.01.13
Level 2 : 6~13(숙제 및 깨달은 점)_scroll  (0) 2023.01.12
    '🟨 JavaScript/문제풀기 (프로그래머스, 코딩애플)' 카테고리의 다른 글
    • Level 3 : 9 장바구니버튼 구현하기(localStorage, array, forEach, JSON)
    • Level 3 : 5~8 (ajax, json, array, sort)
    • Level 3 : 1~3 (array, object)
    • [중요] Level 2 : 14,15(숙제 및 깨달은 점)_for, 버블링활용축약버전
    고슴맨쉬
    고슴맨쉬
    부수되 집착하지 않고, 이해하되 머무르지 않기

    티스토리툴바