Fetch API 데이터로 정렬 (평점순 / 제목순 / 개봉일순)

728x90
반응형

 


TIL

1. fetch함수는 비동기함수여서 데이터를 가져와도 전역변수에 할당 불가능하다고 생각함

> 아님 (가능함)

 

2. fetch함수에서 데이터를 html로 append하는 것이여서, 다시 호출해야한다고 생각함

> 아님 (그럴필요없음)

 

3. flow

* fetch함수에서 데이터 부분을 전역변수에 저장

* html에 append하는 구간을 함수 생성 + 정렬종류는 함수 인자값으로 받기

* 정렬종류가 선택되면 전역변수를 해당값에 맞게 정렬 후 html에 append하는 함수(정렬된 데이터값) 실행


 
let data = {};
    .then((response) => response.json())
    .then((response) => {
        data = response.results;
        drawCard(data);
    })
    .catch((err) => console.error(err));

1. fetch로 받은 데이터 = response.results:  전역변수 data에 저장

2.drawCard함수에 배열을 인자값 설정 

 


function drawCard(sortType) {
    //빈화면 만들기
    document.querySelector('#movies').innerHTML = '';

    sortType.forEach((movie) => {
        const template = `
                      <div class = "movie" id = "${movie.id}" >
                        ${movie.poster_path}" alt=""/>
                        <div class = "text">
                          <h3 class = "title">${movie.title}</h3>
                        </div>
                          <button class="detailpage_btn">영화 상세보기</button>
                        </div>
                       
                        <div class="modal" id = "${movie.id}" style="display: none;">
                          <div class="desc">${movie.overview}</div>
                          <button class="close">X</button>

                        </div>`;
        document.querySelector('#movies').insertAdjacentHTML('beforeend', template);
        displayShow();
        displayHide();
    });
}

3. document.querySelector("#movies").innerHTMl =""; 빈 화면으로 만들어주기 

4. drawCard함수에 인자값 sortType에 따라" 평점순 / 제목순 / 개봉일순" 변경 + 데이터를 insertAdjacentHTML로 붙이기

 

<select id="orderType">
                        <option title="현재 선택됨" value="1">선택</option>
                        <option value="2">평점순</option>
                        <option value="3">제목순</option>
                        <option value="4">개봉일순</option>
                    </select>

5. html파일에서 select태그 설정

 

document.getElementById('orderType').addEventListener('change', function (event) {
    const orderType = document.getElementById('orderType');
    const selectType = orderType.options[orderType.selectedIndex].value;
    console.log(selectType);

    if (selectType === '1') {
        //선택 (원래대로)
        drawCard(data);
    } else if (selectType === '2') {
        //평점순
        voteAverage();
    } else if (selectType === '3') {
        //제목순
        orderABC();
    } else if (selectType === '4') {
        //개봉일순
        releaseDate();
    }
});

6. js 파일에서 select태그가 변경될때 addEventListener사용 

7. script 에서 select 태그에서 선택된 option 값 가져오기

: document.getElementById('orderType').options[orderType.selectedIndex].value; 

 

//[정렬1] 평점순
function voteAverage() {
    let sortVoteRate = data
        .map((v) => v)
        .sort(function (a, b) {
            return b.vote_average - a.vote_average;
        });
    drawCard(sortVoteRate);
}

//[정렬2] 제목순 (가나다순)
function orderABC() {
    let sortAZ = data
        .map((v) => v)
        .sort(function (a, b) {
            return a.title.toLowerCase() < b.title.toLowerCase() ? -1 : 1;
        });

    drawCard(sortAZ);
}

//[정렬3]개봉일순
function releaseDate() {
    console.log(data);

    let sortVoteRate = data
        .map((v) => v)
        .sort(function (a, b) {
            return b.release_date.replaceAll('-', '') - a.release_date.replaceAll('-', '');
        });

    drawCard(sortVoteRate);
}

8. 전역으로 저장된 data를 map 메소드를 사용해서 복사 + sort메소드로 정렬 

9. drawCard(선택된배열) 실행 => 화면에서 append

 

 

 

반응형