IT

テーブル並べ替え①

①JavaScriptのarray.sort()は、要素を文字列として並べ替えます。つまり、数値の場合「1, 10, 11, 2, …」の順番になります。要素が数字の場合は数値として並べ替える(1, 2, …, 10, 11)ように指定しました。

②通常の並べ替えを行った場合、空白(null)が先頭に来てしまいます。昇順のときは空白が末尾、降順のときは空白が先頭に来るように、処理を追加しました。

③並べ替えられた後のデータの順番を知りたい。左端にNo列があることを前提としたコーディング例。

No数値1数値2文字1文字2大分類小分類
000AA市A町
101BA市B町
202CA市C町
303DB市A町
404EB市B町
505FB市C町
606GC市A町
707HC市B町
808IC市C町
909J
1010K
1111L
No市区町村コード区名ふりがな英語面積人口
114101鶴見区つるみくtsurumi33.23
214102神奈川区かながわくkanagawa23.73
314103西区にしくnishi7.03
414104中区なかくnaka21.2
514105南区みなみくminami12.65
614106保土ケ谷区ほどがやくhodogaya21.93
714107磯子区いそごくisogo19.05
814108金沢区かなざわくkanazawa30.96
914109港北区こうほくくkohoku31.4
1014110戸塚区とつかくtotsuka35.79
1114111港南区こうなんくkonan19.9
1214112旭区あさひくasahi32.73
1314113緑区みどりくmidori25.51
1414114瀬谷区せやくseya17.17
1514115栄区さかえくsakae18.52
1614116泉区いずみくizumi23.58
1714117青葉区あおばくaoba35.22
1814118都筑区つづきくtsuzuki27.87
(㎡)(人)
<script>
'use strict'
window.onload = function () {
  document.querySelectorAll('table').forEach(function(table) {
    if (table.tHead) {
      table.tHead.querySelectorAll('th').forEach(function(th) {
        th.classList.toggle('asc');
        th.onclick = function(e) {
          if (e.target.textContent != 'No') {
            e.target.classList.toggle('asc');
            e.target.classList.toggle('desc');
          }
          var cells = new Array();
          for (let i = 0; i < table.tBodies[0].rows.length; i++) {
            var cell = new Object();
            cell.row = table.tBodies[0].rows[i];
            cell.key = table.tBodies[0].rows[i].cells[e.target.cellIndex].textContent;
            cells.push(cell);
          }
          if (e.target.classList.contains('desc')) {
            cells.sort(desc);
          } else {
            cells.sort(asc);
          }
          for (let i = 0; i < cells.length; i++) {
            cells[i].row.cells[0].textContent = i + 1;
            table.tBodies[0].appendChild(cells[i].row);
          }
        };
      });
    }
  });
};
function asc(a, b) {
  if (a.key == '') return 1;
  if (b.key == '') return -1;
  if (!isNaN(a.key)) {
    if (!isNaN(b.key)) {
      return a.key - b.key;
    }
  }
  if (a.key < b.key) return -1;
  if (a.key > b.key) return 1;
  return 0;
}
function desc(a, b) {
  if (a.key == '') return -1;
  if (b.key == '') return 1;
  if (!isNaN(a.key)) {
    if (!isNaN(b.key)) {
      return b.key - a.key;
    }
  }
  if (a.key < b.key) return 1;
  if (a.key > b.key) return -1;
  return 0;
}
</script>

コメント