I'm using this code from W3Schools for sorting all table rows by clicking on column header. As expected, this orders all rows by that col value.
I'm shure this has already been answered somewere but I't has been difficult for me to filter serarch results to find a similar way (hopefully in pure javascript) of sorting columns by clicking on a first column row.
That should order all columns by that clicked row values.
I'm hoping for some combined method that could order by column AND by row depending on user click, but just a Sort by Row method would be OK.
Thanks in advace!
Expected behavior
Unsorted table:
<table id="myTable">
<tbody>
<tr>
<th onclick="sortTableRows(0)">Name</th>
<th onclick="sortTableRows(1)">Col 1</th>
<th onclick="sortTableRows(2)">Col 2</th>
<th onclick="sortTableRows(3)">Col 3</th>
</tr>
<tr>
<td onclick="sortTableCols(1)">Alan Brado</td>
<td>2</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td onclick="sortTableCols(2)">Kevin Chuca</td>
<td>1</td>
<td>3</td>
<td>2</td>
</tr>
<tr>
<td onclick="sortTableCols(3)">Pamela Chu</td>
<td>3</td>
<td>2</td>
<td>1</td>
</tr>
</tbody>
</table>
NORMAL: Sorted table by COLUMN (Col 1):
<table id="myTable">
<tbody>
<tr>
<th onclick="sortTableRows(0)">Name</th>
<th onclick="sortTableRows(1)">*Col 1*</th>
<th onclick="sortTableRows(2)">Col 2</th>
<th onclick="sortTableRows(3)">Col 3</th>
</tr>
<tr>
<td onclick="sortTableCols(1)">Kevin Chuca</td>
<td>1</td>
<td>3</td>
<td>2</td>
</tr>
<tr>
<td onclick="sortTableCols(1)">Alan Brado</td>
<td>2</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td onclick="sortTableCols(3)">Pamela Chu</td>
<td>3</td>
<td>2</td>
<td>1</td>
</tr>
</tbody>
</table>
DESIRED: Sorted table by ROW (Alan Brado):
<table id="myTable">
<tbody>
<tr>
<th onclick="sortTableRows(0)">Name</th>
<th onclick="sortTableRows(1)">Col 3</th>
<th onclick="sortTableRows(2)">Col 1</th>
<th onclick="sortTableRows(3)">Col 2</th>
</tr>
<tr>
<td onclick="sortTableCols(1)">*Alan Brado*</td>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td onclick="sortTableCols(2)">Kevin Chuca</td>
<td>2</td>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td onclick="sortTableCols(3)">Pamela Chu</td>
<td>1</td>
<td>3</td>
<td>2</td>
</tr>
</tbody>
</table>
And here is my snippet:
function sortTableRows(n) {
var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
table = document.getElementById("myTable");
switching = true;
dir = "asc";
while (switching) {
switching = false;
rows = table.getElementsByTagName("TR");
for (i = 1; i < (rows.length - 1); i++) {
shouldSwitch = false;
x = rows[i].getElementsByTagName("TD")[n];
y = rows[i + 1].getElementsByTagName("TD")[n];
if (dir == "asc") {
if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
shouldSwitch= true;
break;
}
} else if (dir == "desc") {
if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
shouldSwitch= true;
break;
}
}
}
if (shouldSwitch) {
rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
switching = true;
switchcount ++;
} else {
if (switchcount == 0 && dir == "asc") {
dir = "desc";
switching = true;
}
}
}
}
function sortTableCols(n) {
alert("This should sort cols by row #"+n+" values");
}
/* Just for beauty */
#myTable {
border: none;
}
#myTable th {
cursor: pointer;
width: 5%;
border: none;
background-color: #e0e0e0;
}
#myTable tr td {
border: none;
border-bottom: 1px solid #aaa;
text-align: center;
}
#myTable tr td:first-child {
cursor: pointer;
background-color: #e0e0e0;
border-bottom: 1px solid #aaa;
text-align: center;
}
#myTable tr:last-child td {
border: none;
}
<table id="myTable">
<tbody>
<tr>
<th onclick="sortTableRows(0)">Name</th>
<th onclick="sortTableRows(1)">Col 1</th>
<th onclick="sortTableRows(2)">Col 2</th>
<th onclick="sortTableRows(3)">Col 3</th>
</tr>
<tr>
<td onclick="sortTableCols(1)">Alan Brado</td>
<td>2</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td onclick="sortTableCols(2)">Kevin Chuca</td>
<td>1</td>
<td>3</td>
<td>2</td>
</tr>
<tr>
<td onclick="sortTableCols(3)">Pamela Chu</td>
<td>3</td>
<td>2</td>
<td>1</td>
</tr>
</tbody>
</table>