技術ブログ

【JavaScript】テーブル並べ替え

①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鶴見区つるみくtsurumi
214102神奈川区かながわくkanagawa
314103西区にしくnishi
414104中区なかくnaka
514105南区みなみくminami
614106保土ケ谷区ほどがやくhodogaya
714107磯子区いそごくisogo
814108金沢区かなざわくkanazawa
914109港北区こうほくくkohoku
1014110戸塚区とつかくtotsuka
1114111港南区こうなんくkonan
1214112旭区あさひくasahi
1314113緑区みどりくmidori
1414114瀬谷区せやくseya
1514115栄区さかえくsakae
1614116泉区いずみくizumi
1714117青葉区あおばくaoba
1814118都筑区つづきくtsuzuki
<script>
window.addEventListener('load', function () {
  let tbl = initialize();
  document.querySelectorAll('table thead th').forEach(th => {
    th.onclick = function () {
      let colIndex = this.cellIndex;
      if (colIndex == 0) return;
      let table = this.parentNode.parentNode.parentNode;
      let tableIndex = getTableIndex(table);
      if (table.rows[0].cells[0].textContent != "No") return;
      let cols = new Array;
      for (let i = 1; i < table.rows.length; i++) {
        let col = new Object;
        col.row = table.rows[i];
        col.key = table.rows[i].cells[colIndex].textContent;
        cols.push(col);
      }
      if (tbl[tableIndex][colIndex] == -1) {
        cols.sort(desc);
      } else {
        cols.sort(asc);
      }
      let tbody = this.parentNode.parentNode;
      for (let i = 0; i < cols.length; i++) {
        tbody.appendChild(cols[i].row);
      }
      for (let i = 1; i < table.rows.length; i++) {
        table.rows[i].cells[0].textContent = i;
      }
      if (tbl[tableIndex][colIndex] == -1) {
        tbl[tableIndex][colIndex] = 1;
      } else {
        tbl[tableIndex][colIndex] = -1;
      }
    };
  });
});
function initialize() {
  let tables = document.getElementsByTagName('table');
  let obj = new Array(tables.length);
  for (let i = 0; i < tables.length; i++) {
    obj[i] = new Array(tables[i].rows[0].cells.length);
  }
  return obj;
}
function getTableIndex(table) {
  let tables = document.getElementsByTagName('table');
  for (let i = 0; i < tables.length; i++) {
    if (tables[i] == table) {
      return i;
    }
  }
}
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>

コメント