HTMLのテーブルでソートする方法をサンプルコード付き解説!
HTMLのテーブルはhtmlファイルに記述しただけでは、順番を変えたりすることはできません。JavaScriptを用いることで表示を変えたりすることができます。この記事ではJavaScript(jQuery)を用いて、テーブルをソートする方法を解説しています。
HTMLのテーブルでソートさせたい
HTMLファイルを作成して表テーブルを表示させた場合、そのままでは順番を変えたりすることはできません。
テーブルでソートしたい場合には、JavaScriptやそのライブラリであるjQueryを使うことで実現できます。
テーブルでソートさせるためのJavaScriptのプラグインがいくつか公開されていますが、今回は公開されているプラグインは使わずにテーブルのソート機能を実装する方法を解説していきたいと思います。
HTMLのテーブルでソートする方法
テーブルでソートする機能を実装したサンプルコードを紹介し、順番に解説していきたいと思います。
テーブルのヘッダをクリックすると、クリックした項目に関して昇順と降順にソートされるようにしていきます。
HTMLでテーブルを作成
まずはHTMLでソート対象となるテーブルを作成します。
index.html
<table id="table" class="table table-info table-striped table-bordered">
<thead>
<tr>
<th id="0" data-sort="">id</th>
<th id="1" data-sort="">name</th>
<th id="2" data-sort="">price</th>
<th id="3" data-sort="">ranking</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>CD</td>
<td>1000</td>
<td>3</td>
</tr>
<tr>
<td>2</td>
<td>towel</td>
<td>1200</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>flag</td>
<td>800</td>
<td>1</td>
</tr>
<tr>
<td>4</td>
<td>T-shirt</td>
<td>2000</td>
<td>4</td>
</tr>
</tbody>
</table><!-- #table -->
ソート機能を実装する前の準備を行います。
th
タグに一番左から0
とした列の順番をid
属性の値に設定します。
また、昇順か降順かを指定するためにdata-sort
カスタム属性に初期状態として値を設定しない状態で設定します。
tbody
にはtr
タグごとに任意のデータを準備します。
また、Bootstrapを用いてデザインするためにtable
タグにクラスを与えています。
これでHTMLでの準備は終了です。
ソート機能の実装
今回、jQueryを用いてテーブルのソート機能を実装していきたいと思います。
jQuery
/**
* クリックイベント
*/
$('th').click(function(){
// 情報取得
let ele = $(this).attr('id');
let sortFlg = $(this).data('sort');
// リセット
$('th').data('sort', "");
// ソート順序
if(sortFlg == "" || sortFlg == "desc"){
sortFlg = "asc";
$(this).data('sort', "asc");
}else{
sortFlg = "desc";
$(this).data('sort', "desc");
}
// テーブルソート処理
sortTable(ele, sortFlg);
});
前述の通り、テーブルのヘッダをクリックするとソートされるように、th
タグにクリックイベントを設定しています。
イベント発火後の処理で情報を取得し、その情報を元にソート行います。
また、情報取得後にはsort
カスタム属性をリセットするようにします。
定義したsortTable
関数にクリックした要素のid
属性の値とソート順序を指定したフラグを引数として渡します。
index.js
/**
* テーブルソートメソッド
*
* @param ele
* @param sortFlg
*/
function sortTable(ele, sortFlg){
let arr = $('table tbody tr').sort(function(a, b){
// ソート対象が数値の場合
if($.isNumeric($(a).find('td').eq(ele).text())){
let aNum = Number($(a).find('td').eq(ele).text());
let bNum = Number($(b).find('td').eq(ele).text());
if(sortFlg == "asc"){
return aNum - bNum;
}else{
return bNum - aNum;
}
}else{ // ソート対象が数値でない場合
let sortNum = 1;
// 比較時は小文字に統一
if($(a).find('td').eq(ele).text().toLowerCase() > $(b).find('td').eq(ele).text().toLowerCase()){
sortNum = 1;
}else{
sortNum = -1;
}
if(sortFlg == "desc"){
sortNum *= (-1);
}
return sortNum;
}
});
$('table tbody').html(arr);
}
実際にテーブルのソートを行う機能の関数を実装していきます。
ここで重要になるのが、sort
メソッドです。
sort
メソッドは配列オブジェクトのソートを行うメソッドです。引数に何も指定しなければ配列の要素を昇順に並び替えますが、引数にコールバック関数を渡すことでそのコールバック関数の中でソートの方法を定義することができます。
コールバック関数に指定している引数a,b
は配列の要素が順に渡されます。
sort
メソッドはコールバック関数の中で返す戻り値によってソート方法が変わります。
0
より小さい場合、a
をb
の前にする。0
に等しい場合、そのままにする。0
より大きい場合、b
をa
の前にする。
sortTable
関数に渡した引数sortFlg
やa
,b
の値に応じて、上記のような戻り値を返すように条件分岐を行います。また、ソート対象が数値とそれ以外の場合で処理を分けています。
最後に、ソート処理を行った後の配列がarr配列に格納されて、arr
配列をtable
タグのtbody
タグの中身に反映されることでテーブルのソートが完了します。
まとめ
今回、HTMLのテーブルでソートする方法を解説しました。ソートはテーブルに限らず、実装する機会が多いのです。
サンプルコードを参考にして、実際に手を動かしsort
メソッドを使いこなせるようになりましょう。