javascript - 如何在javascript中对数字进行排序

标签 javascript

我正在尝试在表中使用排序。我正在使用下面给出的方法,但是使用下面的方法对数字进行排序时出现错误。此方法工作正常,但会出现数字 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/

相关文章:

javascript - 使用ajax过滤结果时加载部分html页面

javascript - 为什么 jQuery 结果看起来像一个函数?

javascript - 通过指定打印机名称打印到打印机 - Javascript

javascript - "Uncaught SyntaxError: Unexpected token <"导入时出错

javascript - jQuery on click事件到scrollToTop然后重定向

javascript - 不要重新分配变量重新加载脚本

javascript - Extjs 远程组合验证问题

javascript - 如何使用 RegEx 从 npm install 命令获取应用程序名称?

javascript - 启用禁用 Selectric 选择框

javascript - 如何使用js查找用户是否可以单击html中的给定按钮?