• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 JavaScript, TS 게시판 안녕하세요 상품필터 부분 질문이 있습니다.

안녕하세요 상품필터 부분 질문이 있습니다.

4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 글쓴이
  • #25133

    AlgoRoot
    참가자

    안녕하세요. 강사님, 상품필터를 하는 과정에서 제가 여러 경우로 코드를 짰는데요.. 이중필터가 되지 않아서 질문드립니다. 이 외 질문이 꽤 있는데요.. 미리 질문많은점 죄송합니다. 제 자신이 너무 답답해요 아직 개념이 많이 부족한것같습니다..명쾌한 답변 부탁드릴게요ㅜ

     

    **그리고 강의 정말 잘 듣고 있어요. 비전공자로서 이번달에 공부시작하면서 자바스크립트 문법공부하다가 스트레스 엄청받았는데 우연히 강사님 강의를 유투브로 보고 바로 강의시작했습니다. 강사님 덕분에 재미를 느낍니다. . 감사합니다. 

     

    코드는  맨 아래에 첨부하겠습니다. (코드를 복붙했는데 이상하게 보이네요.. 템플릿 에 넣을 때 사용한 백틱기호도 안보이고요  파일첨부가 안되서 어쩔 수 없이 그냥 올려요. 다른 방법있음 말씀주세요.) 

    깃헙에 소스 올렸습니다.  https://github.com/AlgoRoots/JavaScript-Task-1/tree/main/applecoading-ask

     

    --질문 1

    제품가격필터를 하고 그 상태에서 '가격낮은 순' or 높은순 or A to Z or Z to A 를 눌렀을 때 

    가격필터 한 것 내에서 분류가 되야하는데 전체 상품개수에서 분류를 하는 오류가 납니다. 

    저와 같은 고민을 하고 계시는 분의 질문에 강사님의 남기신 댓글을 봤는데요.

    (  1. 가격필터를 했을 경우 newProduct 이런 변수가 생길거같은데 

    newProduct가 있을 경우 그 변수로 sort하라고 코드를 짜는것이 어떨까요 

    아니면 2, 가격필터를 먹였는지 안먹였는지 여부를 어디다 저장해놓는 것도 좋겠군요 )

    2번 방법은 어떻게 할지 모르겠어서, 1번 방법으로 이것저것 해봤는데 NEWProduct 가 정의되지 않았다고 뜨거나, 안됩니다. 제가 잘못 코드를 짠거겠죠..

    아니면 NEWProduct 를 const라는 변수로 정의했는데 이게 가격필터를 했을 때는 지역변수안에서 정의한거라 당연히 안되는건가요?  

    오래고민하고 시도하다가 질문드립니다. 이쪽부분이 너무 이해가 약한것같아요..

    본질적인 답을 받을 수 있을까요?  1번과 2번 방법 모두 어떻게 짜야하는지 궁금합니다. 

    --질문2 

    첫 번째 질문의 연장선이 될 수 있겠습니다. 

    // Price 에서 sort를 쓸 때 데이터바인딩과정을 해야한다고 했는데 그 과정을 .
    for (let i = 0; i < 5; i++){
    ProductTitle[i].innerHTML = products[i].title;
    ProductSpan[i].textContent = ('Price: $ ' + products[i].price);
    }

    이렇게 썼었다면,  제가 상품필터에 템플릿을 넣으면서 html에 product안에 들어갔던 것들을 주석처리했거든요. 그러면 저 함수가 안먹히는것아닌가요? 그래서 그런지 상품을 클릭하면 

    Uncaught TypeError: Cannot set properties of undefined (setting 'innerHTML')

    이런 오류가 뜹니다.  어떤 코드로 대체해야하는건가요? 

    -- 질문 2 - 1

    만약 상품의 개수가 많아졌을 때 forEach 를 써서 만들려면 어떻게 해야하나요? 

    products.forEach((i) => {
    ProductTitle[i].innerHTML = products[i].title;
    ProductSpan[i].textContent = ('Price: $ ' + products[i].price);
    })

    이렇게 해봤는데 오류납니다ㅠㅠ

    -- 질문3

    또 템플릿을 각각 가격필터버튼에 넣었는데, 이렇게 되면 $20이하 , $20-$40,  $40이상 세개의 버튼에 각각 템플릿을 넣어야하는데, 혹시 이 부분의 코드를 줄일 수 있는 방법이있나요? 이것 또한 함수밖에서 템플릿 변수를 정의하면 안되더라구요. 

    감사합니다.

    #25156

    codingapple
    키 마스터

    1 함수안에서만든 변수는 그 안에서만 사용가능하고 함수 밖에나가면 없다고 나옵니다 

    함수바깥에 만든 변수는 내부에서 자유롭게 사용가능합니다

     

    2 ProductTitle[0]이 비어있다는 뜻인듯요 

    ProductTitle 변수 처음에 만들 때 없어서 그런가봅니다 반복문 안에서 셀렉터 새로 쓰면 됩니다 

     

    2-1은 무슨오류인가요 2번이랑 비슷할 것 같군요 

    3 긴 코드는 함수로 묶어두면 재사용가능합니다

    템플릿 만들고 복붙하는 코드를 함수로 묶으면 될듯요 

    #25211

    AlgoRoot
    참가자

    강사님 답변 감사드립니다. 한참보고 또 만져봤는데 정말 모르겠습니다..  우선 답변달아주신것도 잘 이해가 가지않거나, 이해가 가는것은 해봤는데 안되서 다시 답변에 대해서 질문드립니다. 

    시간 써주셔서 감사합니다.

    질문 1 답변에 대해서 :  

    함수 밖에서 정의한 변수는 안에서도 동작한다고 하신 말은 이해가 갑니다. 하지만, 

     NEWProducts 라는 새 변수를 각각의 가격필터를 하는  filter 함수 내에서 각각의 필터조건에 부합하는 NEWProducts라는 변수를 정의했는데 (함수내에서) 이렇게 각각 정의된  NEWProducts이기 때문에 함수 밖에서 정의할 수 없지 않나요? 

        하나로 예를 들면 아래와같이 NEWProducts 필터조건이 다르니까요..

      $('#price_20to40').click(function(){

          ProductsGroup.innerHTML = '';

          const NEWProducts = products.filter(a => 20 < a.price && a.price< 40);

          console.log(NEWProducts);

          NEWProducts.forEach(function(a){

              let template = `

              <div class="products">

                  <img src="https://via.placeholder.com/600">

                  <div class="products-body">

                      <h5 class="product-title">${a.title}</h5>

                      <p> <span class="PDSpan">Price: $ ${a.price}</span> </p>

                      <button class="product-btn btn-danger">Order</button>

                  </div>

              </div>

              `;

              ProductsGroup.insertAdjacentHTML("beforeend", template);

          })

      })

    그래서  

    (1. 가격필터를 했을 경우 newProduct 이런 변수가 생길거같은데 

    newProduct가 있을 경우 그 변수로 sort하라고 코드를 짜는것이 어떨까요 

    아니면 2, 가격필터를 먹였는지 안먹였는지 여부를 어디다 저장해놓는 것도 좋겠군요 )

    여기서 저는 1번으로 이중필터가 되게끔 하려고 했던건데, 필터함수에 각각있는 NEWProducts 라는 변수를 sort 를 이용해 오름차순,내림차순하는 함수에서는 어떻게  NEWProducts안에 있는 함수로 sort하라고 짤 수 있나요?

    새로 NEWProducts를 sort안에서 또 정의해야하나요? 이게 맞다고해도 어떻게짜야될지 감이 안옵니다ㅠㅠ

    그리고 2번도 어떻게 코드 짜는지 궁금한데 알 수 있을까요?

     

     

    질문 2 답변에 대해서 :  
    2, 2-1 

    이부분도 1번과 연관이 있을 것도 같아 다시 질문드려요. 

    제가 정의한 변수는 

      let ProductTitle = document.getElementsByClassName('product-title');

      let ProductSpan = document.getElementsByClassName('PDSpan');

    이랬구요. 하지만, html을 자바스크립트에 동적으로 생성하면서 html에 해당하는 부분은 다 주석처리를 했어요. 

    그래서  ProductTitle[0]라는게 없다고 나오는게 말씀처럼 맞는 것 같아요.

    강사님께서 반복문 안에서 셀렉터를 새로 쓰시라고 하셨는데, 

    아래와 같이 했을 때 버튼을 누르면 

    “Uncaught TypeError: Cannot set properties of undefined (setting 'innerHTML')

        at HTMLButtonElement.<anonymous> (sub.js:346:35)

    (anonymous) @ sub.js:346”

    라고 뜹니다. 그러면서 필터가 전체 항목 내에서 가격이 낮은 순으로 떠요..

    필터로 걸러진 상품들 안에서 필터가 되야되는데 말이죠..

    1번과 2번 질문 다 해결되면 이중필터가 잘될것 같은데 ㅜㅜ잘 모르겠습니다. 제가 쓴 반복문은 아래와 같아요.

     

      // Price 

      sortByBtnPriceLow.addEventListener('click', function(){

          

          products.sort(function(a,b){

          return a.price - b.price

          })

          

          for (let i = 0; i < 5; i++){

    // 반복문 안에서 셀렉터를 새로 쓴게 아래와 같은 것 아닌가요? 이러면 안되더라구요ㅜ 뭐가 문제일까요

            // let ProductTitle = document.getElementsByClassName('product-title')[i];

            // let ProductSpan = document.getElementsByClassName('PDSpan')[i];

              ProductTitle[i].innerHTML = products[i].title;

              ProductSpan[i].textContent = ('Price: $ ' + products[i].price);

            }

      })

     

     

    질문 3 답변에 대해서 :  

     

    Template 함수를 만들어 넣었는데 적용이 안됩니다. 어떤부분을 수정해야할까요? 템플릿에 있는${a.title}와 ${a.price}이 지정되지 않아서(?) 그런거 같은데 그래서 어떻게 해야 되는지가 궁금합니다..

    // function template

      function template() {

        `

        <div class="products">

            <img src="https://via.placeholder.com/600">

            <div class="products-body">

                <h5 class="product-title">${a.title}</h5>

                <p> <span class="PDSpan">Price: $ ${a.price}</span> </p>

                <button class="product-btn btn-danger">Order</button>

            </div>

        </div>

        `;

      }

    const filterByBtnUpto20 = document.getElementsByClassName('filterby_price_under20')[0];

      // less than 20 products - Javascripts

      filterByBtnUpto20.addEventListener('click', function(){

          ProductsGroup.innerHTML = '';

          const NEWProducts = products.filter(function(a){

              return a.price <= 20

          })

          NEWProducts.forEach(function(a){

              ProductsGroup.insertAdjacentHTML("beforeend", template());

              // $('#products-group').append(template());

          })

      })

    #25249

    codingapple
    키 마스터

    1 정렬하고 가격필터 둘다 먹이고 싶으면

    정렬버튼누르면 밖에 있는 var newproduct에 정렬결과 저장하고

    가격필터버튼누르면 밖에 있는 var newproduct 가져다가 또 가격필터하면 되겠군요  

    필터했는지 안했는지 여부는 필요없으면 굳이 생각안해도 됩니다 

    2 어레이 자료에 [i]를 두번이나 붙인듯요 

    3 함수안에 a라는 변수가 없어서 그렇습니다 파라미터로 입력할 수 있게 만들면 될듯요 

4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관, 개인정보처리방침
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠