我正在尝试在表中使用排序。我正在使用下面给出的方法,但是使用下面的方法对数字进行排序时出现错误。此方法工作正常,但会出现数字 ASC 和 DESC 顺序问题。我不明白为什么会发生这种事。小伙伴们,你们对此有什么想法吗?
function sortTable(n, selector) {
var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
///table = document.getElementById(selector);
table = $(selector);
switching = true;
//Set the sorting direction to ascending:
dir = "asc";
/*Make a loop that will continue until
no switching has been done:*/
while (switching) {
//start by saying: no switching is done:
switching = false;
rows = $(table).find('tr'); ///table.getElementsByTagName("TR");
/*Loop through all table rows (except the
first, which contains table headers):*/
for (i = 0; i < (rows.length - 1) ; i++) {
//start by saying there should be no switching:
shouldSwitch = false;
/*Get the two elements you want to compare,
one from current row and one from the next:*/
x = rows[i].getElementsByTagName("TD")[n];
y = rows[i + 1].getElementsByTagName("TD")[n];
/*check if the two rows should switch place,
based on the direction, asc or desc:*/
if (x != null && y != null) {
if (dir == "asc") {
if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
//if so, mark as a switch and break the loop:
shouldSwitch = true;
break;
}
} else if (dir == "desc") {
if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
//if so, mark as a switch and break the loop:
shouldSwitch = true;
break;
}
}
}
}
if (shouldSwitch) {
/*If a switch has been marked, make the switch
and mark that a switch has been done:*/
rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
switching = true;
//Each time a switch is done, increase this count by 1:
switchcount++;
} else {
/*If no switching has been done AND the direction is "asc",
set the direction to "desc" and run the while loop again.*/
if (switchcount == 0 && dir == "asc") {
dir = "desc";
switching = true;
}
}
}
}
最佳答案
如果您想使用任何特定列对表行进行排序并按数字排序,您可以利用内置的 Array.prototype.sort 方法,将要排序的行放入数组中,sort数组,然后按所需顺序将行放入表中。例如:
function sortMe(evt) {
var table = this; // Table clicked on
var cell = evt.target; // Cell clicked on
var col = cell.cellIndex; // Column number
// Put rows into an array
var rowArray = [].slice.call(table.rows);
// Or for ECMAScript 2015
// var rowArray = Array.from(table.rows);
// Sort rows
rowArray.sort(function(a, b) {
// Get values of col to sort on
a = a.cells[col].textContent;
b = b.cells[col].textContent;
// If numeric, sort as number
if (isNumeric(a)) {
return a - b;
}
// Other sort options here, e.g. as dates
// Otherwise, sort as string
return a.localeCompare(b);
});
// Put rows back in table in order
var tbody = table.tBodies[0];
rowArray.forEach(function (row) {
tbody.appendChild(row);
})
}
// Helper function
// Check if value is numeric, '2' returns true
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
// Attach listener to table
window.onload = function() {
document.querySelector('table').addEventListener('click', sortMe, false);
}
table {
border-collapse: collapse;
}
td {
border: 1px solid #bbbbbb;
width: 5em;
}
<table>
<tr><td>A<td>3
<tr><td>D<td>0
<tr><td>B<td>1
<tr><td>C<td>2
</table>
单击任意列即可对该列进行排序。您可以添加额外的内容,例如添加页眉和页脚、在升序和降序排序之间切换、处理空白单元格等。
您可以考虑在标题单元格中使用类或数据属性来控制要使用的排序类型。
关于javascript - 如何在javascript中对数字进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44605188/