리우's IT Story
article thumbnail
728x90
반응형

 

자바스크립트 파일 준비 

 

<javaScript>

console.log(arr.length)

        const saleList = arr.filter(ob => ob.price != ob.salePrice)
        console.log(saleList.length)

        const dataList = arr.map(ob => {
            const data = {
                name : ob.name,
                price : ob.price,
                salesCount : ob.salesCount,
                grade: ob.grade
            }
            return data
        })
        console.log(dataList[0])

        const tbody = document.querySelector('tbody')

        let tag =''
        dataList.forEach(ob =>{
                tag += `<tr>`
                tag += `    <td>${ob.name}</td>`
                tag += `    <td>${ob.price}</td>`
                tag += `    <td>${ob.salesCount}</td>`
                tag += `    <td>${ob.grade}</td>`
                tag += `</tr>`
        })
        tbody.innerHTML += tag

map으로 테이블의 구성요소를 새로 지정한 후 자바스크립의 반복문을이용해서 tr에 td를 직접 채워준다. 

 

 

 

 

상품이름을 클릭하면 가나다 순으로 정렬 

 

// name을 클릭하면 각 객체의 name을 기준으로 정렬하기
        const name = document.querySelector('th.name')

        name.onclick = function() {
            const trList = document.querySelectorAll('tbody > tr')
            const trArray = Array.from(trList)
            trArray.sort((a,b) => {
                const nameA = a.querySelector('td:nth-child(1)')
                const nameB = b.querySelector('td:nth-child(1)')
                return nameA > nameB ? 1:-1
            })
            trArray.forEach(tr => tbody.appendChild(tr))
        }
변수 nameA의 첫번째 td와 변수 nameB의 첫번째 td를 비교해서 정렬 후 
반복문으로  tr을 tbody에 요소를 하나씩 채워준다. 

 

 

 

 

가격을 클릭하면 오름차순으로 정렬 
 // price를 클릭하면 각 객체의 price를 기준으로 정렬하기
        const price = document.querySelector('th.price')

        price.onclick = function() {
            const trList = document.querySelectorAll('tbody > tr')
            const trArray = Array.from(trList)
            trArray.sort((a,b) => {
                const priceA = +a.querySelector('td:nth-child(2)').innerText
                const priceB = +b.querySelector('td:nth-child(2)').innerText
                return priceA - priceB
            })
            trArray.forEach(tr => tbody.appendChild(tr))
        }
a.querySelector는 단순 문자열만 비교하기 때문에 a앞에 +를 붙여서 정수로 바꿔준다.
td의 두번째 요소를 price A 와 priceB 끼리 서로  비교한 후
appendChild로 데이터를 화면에 출력할 수 있게 해준다. 

 

 

 

 

버튼을 클릭하면 요소를 정렬할 수 있게 코드를 작성했지만 
매번 겹치는 코드가 존재해서 불필요한 메모리소모가 있다. 
불필요한 속성을 제거해서 arr의 내용을 문서에 반영해보자. 

 

 

<script>
        // 불필요한 속성을 제거한 후 
        // arr의 내용을 문서에 반영하기  
        let tag =''
        arr.map(ob =>{
            return {
                name : ob.name,
                price : ob.price,
                salesCount : ob.salesCount,
                grade : ob.grade
            }
        }).forEach(ob =>{
            tag += `<tr>`
                tag += `    <td>${ob.name}</td>`
                tag += `    <td>${ob.price}</td>`
                tag += `    <td>${ob.salesCount}</td>`
                tag += `    <td>${ob.grade}</td>`
                tag += `</tr>`
        })
        tbody.innerHTML += tag
    </script>

 


문서에 반영할 내용을 함수안에 넣어서 쓸 수 있다. 

  // 불필요한 속성을 제거한 후 
        // arr의 내용을 문서에 반영하기 
        const tbody = document.querySelector('tbody')
        function loadHandler(){
            let tag =''
            arr.forEach(ob =>{
                    tag += `<tr>`
                    tag += `    <td class="name">${ob.name}</td>`
                    tag += `    <td class="price">${ob.price}</td>`
                    tag += `    <td class="salesCount">${ob.salesCount}</td>`
                    tag += `    <td class="grade">${ob.grade}</td>`
                    tag += `</tr>`
            })
            tbody.innerHTML += tag
        }

        window.onload = loadHandler

 

 

th를 클릭하면 각 클래스의 이름을 기준으로 정렬하기 
        //th를 클릭하면 각 클래스의 이름을 기준으로 정렬하기 
        const thList = document.querySelectorAll('th')
        function sortHandler(event){
            const className = event.target.className
            alert(className)
        }
        thList.forEach(th => th.onclick = sortHandler)

 

th를 누르면 class이름이 뜨게 경고창을 만들어준다. 

 

 

 

각각의 th에 있는 요소를 클릭만 해도 함수하나를 가지고  여러 컬럼들을 원하는 데로 정리할 수 있다.

클릭 당한 th의 class이름을 불러오는 것이다. 

 

 const thList = document.querySelectorAll('th')
        function sortHandler(event){
            const className = event.target.className
            const trArray  = Array.from(document.querySelectorAll('tbody > tr'))
            trArray.sort((a,b) => {
                // .으로 시작하는 것이 class이름이기 때문에
                // 값이 .className으로 바뀌어야 되기때문에 let이어야한다. 
                let valueA = a.querySelector('.'+className).innerText
                let valueB = b.querySelector('.'+className).innerText
                // class이름이 name이 아니면 +를 붙혀준다. (정수로 계산해야 하기때문)
                if(className != 'name'){
                    valueA = +valueA
                    valueB = +valueB
                }
                let result = valueA > valueB ? 1:-1
                return result
            })
            trArray.forEach(tr => tbody.appendChild(tr))
        }
        thList.forEach(th => th.onclick = sortHandler)

 

 


 

하나의 함수가 8개의 기능을 수행한다. 

 

//th를 클릭하면 각 클래스의 이름을 기준으로 정렬하기 
        const thList = document.querySelectorAll('th')
        function sortHandler(event){
            //클릭당한 th의 className을 불러온다.
            const className = event.target.className
            
            //클릭당한 th의 order 속성값을 정수로 불러온다.
            const order = +event.target.getAttribute('order')

            //클릭당한 th 내부의 span을 불러온다(모든 span에 대해서 글자를 지우고 수행한다.)
            document.querySelectorAll('thead span').forEach(span =>span.innerText='')
            const span = event.target.querySelector('span')
            // oder가 0보다 크면 ▲ 아니면 ▼
            span.innerText = order > 0 ? '▲' : '▼'
            
            const trArray  = Array.from(document.querySelectorAll('tbody > tr'))


            trArray.sort((a,b) => {
                // .으로 시작하는 것이 class이름이기 때문에
                // 값이 .className으로 바뀌어야 되기때문에 let이어야한다. 
                let valueA = a.querySelector('.'+className).innerText
                let valueB = b.querySelector('.'+className).innerText
                // class이름이 name이 아니면 (정수로 계산해야 하기때문) +를 붙혀준다.
                if(isNumeric(valueA) && isNumeric (valueB)){
                    valueA = +valueA
                    valueB = +valueB
                }
                let result = valueA > valueB ? 1:-1
                
                //현재값에서 order가 바뀌면 -1이 추가가 되는 것이다. 
                event.target.setAttribute('order', order * -1)
                return result * order
            })
            trArray.forEach(tr => tbody.appendChild(tr))
        }
        thList.forEach(th => th.onclick = sortHandler)

 

 

클릭당한 th의 order 속성값을 정수로 불러온다.
클릭당한 th 내부의 span을 불러온다 (모든 span에 대해서 글자를 지우고 수행한다.)
order가 0보다 크면 ▲ 아니면 ▼

 

 

 

 

728x90
반응형

'vscode를 이용한 웹구축(html)' 카테고리의 다른 글

javascript  (0) 2023.07.20
semantic 태그, flex-flow 연습  (0) 2023.07.18
쇼핑몰 따라만들기  (0) 2023.07.13
HTML CSS <style> font- style  (0) 2023.07.12
html에 대한 기초 정리 , background  (0) 2023.07.12
profile

리우's IT Story

@LRWoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!