javascriptでソート付きの表を作りました。
一応自分の希望するような動きにはなったのですが、もっと洗練された書き方があれば教えてください。
ソートしたデータを表示する過程がこれでいいのか??と思っています。
js
1const tbl_ths =['Name', 'gender','Team', 'Score',]; 2let tbl_dat=[ 3 ['Tokieda','男','red','2'], 4 ['takahashi','男','blue','12'], 5 ['miyahashi','男','blue','31'], 6 ['taguchi','女','Orange','32'], 7 ['fkoji','男','red','84'], 8 ['masako','女','Blue','49'], 9]; 10let tbl_sort; 11let col; 12let _a; 13let _b; 14let cf; 15 16function doSort(){ 17 18 const ths =document.querySelectorAll('th'); 19 ths.forEach((th,index) =>{ 20 if (index !== col){ 21 th.className = ''; 22 } 23 }) 24 tbl_dat.sort((a, b)=> { 25 if(isNaN( a[col])){ 26 _a = a[col].toLocaleLowerCase(); 27 _b = b[col].toLocaleLowerCase(); 28 } else { 29 _a = Number(a[col]); 30 _b = Number(b[col]); 31 } 32 33 if (_a > _b){ 34 return 1*cf 35 } else if (_a < _b){ 36 return -1*cf 37 } else { 38 return 0 39 } 40 }) 41 42const tbody=document.querySelector('tbody'); 43tbody.remove(); 44 45 const date = new SetDate(tbl_dat); 46} 47 48 49class SetHead { 50 constructor(els){ 51 const table = document.querySelector('table'); 52 const thead = document.createElement('thead'); 53 const tr=document.createElement('tr'); 54 55 for(let i=0;i<els.length;i++){ 56 const th=document.createElement('th'); 57 th.innerHTML=els[i]; 58 th.addEventListener('click',()=>{ 59 col=th.cellIndex; 60 61 if(th.classList.contains('ascend')){ 62 th.className='decend'; 63 cf=-1; 64 }else { 65 th.className='ascend'; 66 cf=1; 67 } 68 doSort(); 69 70 }) 71 tr.appendChild(th); 72 } 73 thead.appendChild(tr); 74 table.appendChild(thead); 75 } 76} 77 78class SetDate { 79 constructor(array){ 80 const table = document.querySelector('table'); 81 const tbody = document.createElement('tbody'); 82 83 array.forEach(els => { 84 const tr=document.createElement('tr'); 85 86 for(let i=0;i<els.length;i++){ 87 const td=document.createElement('td'); 88 td.innerHTML=els[i]; 89 tr.appendChild(td); 90 }; 91 92 tbody.appendChild(tr); 93 }) 94 table.appendChild(tbody); 95 } 96} 97 98const header=new SetHead(tbl_ths); 99const date = new SetDate(tbl_dat);
html
1<body> 2 3 <table class="tbl"> 4 </table> 5 6<script src="main.js"></script> 7</body>
css
1*{ 2 margin:0; 3 padding:0; 4 box-sizing: border-box; 5} 6.tbl { 7 border-collapse: collapse; 8 margin:20px auto; 9 font-family: Verdana, Geneva, Tahoma, sans-serif; 10 font-size: 16px; 11 & td,& th { 12 width:180px; 13 height: 36px; 14 padding:5px 20px; 15 border:1px solid #E9EAE8; 16 } 17 & thead { 18 cursor: pointer; 19 & th::after { 20 content: '\f0dc'; 21 font-family:'FontAwesome'; 22 font-size: 12px; 23 color: #ccc; 24 float: right; 25 padding-top: 4px; 26 font-weight: normal; 27 } 28 & th.decend::after { 29 content: '\f0dd'; 30 color: #000; 31 } 32 & th.ascend::after { 33 content: '\f0de'; 34 color: #000; 35 } 36 } 37 & tbody tr td:last-child { 38 text-align: right; 39 } 40 & tbody tr:nth-child(2n) { 41 background-color: #f8f8f8; 42 } 43 44} 45
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/25 07:50