Sorting HTML table with JavaScript Sorting HTML table with JavaScript javascript javascript

Sorting HTML table with JavaScript


Just revisiting an old solution, I thought I'd give it a facelift for it's ~5 year anniversary!

  • Plain Javascript (ES6)
  • Does alpha and numeric sorting - ascending and descending
  • Works in Chrome, Firefox, Safari (and IE11, see below)

Quick explanation

  1. add a click event to all header (th) cells...
    1. for the current table, find all rows (except the first)...
    2. sort the rows, based on the value of the clicked column...
    3. insert the rows back into the table, in the new order.

const getCellValue = (tr, idx) => tr.children[idx].innerText || tr.children[idx].textContent;const comparer = (idx, asc) => (a, b) => ((v1, v2) =>     v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2)    )(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx));// do the work...document.querySelectorAll('th').forEach(th => th.addEventListener('click', (() => {    const table = th.closest('table');    Array.from(table.querySelectorAll('tr:nth-child(n+2)'))        .sort(comparer(Array.from(th.parentNode.children).indexOf(th), this.asc = !this.asc))        .forEach(tr => table.appendChild(tr) );})));
table, th, td {    border: 1px solid black;}th {    cursor: pointer;}
<table>    <tr><th>Country</th><th>Date</th><th>Size</th></tr>    <tr><td>France</td><td>2001-01-01</td><td><i>25</i></td></tr>    <tr><td><a href=#>spain</a></td><td><i>2005-05-05</i></td><td></td></tr>    <tr><td><b>Lebanon</b></td><td><a href=#>2002-02-02</a></td><td><b>-17</b></td></tr>    <tr><td><i>Argentina</i></td><td>2005-04-04</td><td><a href=#>100</a></td></tr>    <tr><td>USA</td><td></td><td>-6</td></tr></table>