我在表格中有几列,例如A,B,C,D和E列,需要在HTML页面中显示。在某些页面中,我需要显示仅基于页面一列的排序结果,例如表的第三列“C”列。我可以使用以下代码执行此操作:

function Ascending(a, b) {
  if (a < b) return -1;
  if (a > b) return 1;
  return 0;
}
var rows = $('#table tr').not(':first').get();
$('#table tr').slice(1).remove();
rows.sort(function(rowA, rowB) {
  var keyA = $(rowA).children('td').eq(2).text().toUpperCase();
  var keyB = $(rowB).children('td').eq(2).text().toUpperCase();
  return Ascending(keyA, keyB);
});

但是我还有另一个要求,其中我需要显示基于两个列的排序结果,即在上述情况下基于列C的排序,列E的结果也应该排序。例如:

排序前:

Column C  Column E
2         Fish
1         Box
7         Cat
2         Dog
1         Apple
2         Box
2         Axe
7         Box
2         Answer
7         Apple
6         Year
2         Goat

仅对C列进行排序后:

Column C  Column E
1         Box
1         Apple
2         Dog
2         Fish
2         Box
2         Axe
2         Goat
2         Answer
6         Year
7         Box
7         Apple
7         Cat

在对C列和E列进行排序之后:

Column C  Column E
1         Apple
1         Box
2         Answer
2         Axe
2         Box
2         Dog
2         Fish
2         Goat
6         Year
7         Apple
7         Box
7         Cat

我无法执行。我该怎么做?

最佳答案

要按多个列进行排序,您需要编写如下比较函数:

(比较函数传递两个“行”)

  • 将第1行第1列与第2行第1列进行比较
  • 如果它们不同,则返回结果(+ ve或-ve数字)
  • 将第1行第2列与第2行第2列进行比较
  • 如果它们不同,则返回结果(+ ve或-ve数字)
  • 对其余列重复
  • 返回0

  • 下面的示例演示如何编写按两列排序的比较函数。可以使用循环或递归按n列排序。

    $(function() {
      function sortByColumn3(row1, row2) {
        var v1, v2;
        v1 = $(row1).find("td:eq(2)").text();
        v2 = $(row2).find("td:eq(2)").text();
        // for numbers you can simply return a-b instead of checking greater/smaller/equal
        return v1 - v2;
      }
    
      function sortByColumn3And5(row1, row2) {
        var v1, v2, r;
        v1 = $(row1).find("td:eq(2)").text();
        v2 = $(row2).find("td:eq(2)").text();
        r = v1 - v2;
        if (r === 0) {
          // we have a tie in column 1 values, compare column 2 instead
          v1 = $(row1).find("td:eq(4)").text();
          v2 = $(row2).find("td:eq(4)").text();
          if (v1 < v2) {
            r = -1;
          } else if (v1 > v2) {
            r = 1;
          } else {
            r = 0;
          }
        }
        return r;
      }
      $("#button1, #button2").on("click", function() {
        var rows = $("#table1 tbody tr").detach().get();
        switch (this.id) {
          case "button1":
            rows.sort(sortByColumn3);
            break;
          case "button2":
            rows.sort(sortByColumn3And5);
            break;
        }
        $("#table1 tbody").append(rows);
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    
    <input type="button" id="button1" value="sortByColumn3">
    <input type="button" id="button2" value="sortByColumn3And5">
    
    <table id="table1" border="1" width="100%">
      <thead>
        <tr>
          <td>1</td>
          <td>2</td>
          <td>3</td>
          <td>4</td>
          <td>5</td>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>x</td>
          <td>y</td>
          <td>2</td>
          <td>z</td>
          <td>Fish</td>
        </tr>
        <tr>
          <td>y</td>
          <td>z</td>
          <td>1</td>
          <td>x</td>
          <td>Box</td>
        </tr>
        <tr>
          <td>z</td>
          <td>x</td>
          <td>7</td>
          <td>y</td>
          <td>Cat</td>
        </tr>
        <tr>
          <td>x</td>
          <td>y</td>
          <td>2</td>
          <td>z</td>
          <td>Dog</td>
        </tr>
        <tr>
          <td>y</td>
          <td>z</td>
          <td>1</td>
          <td>x</td>
          <td>Apple</td>
        </tr>
        <tr>
          <td>z</td>
          <td>x</td>
          <td>2</td>
          <td>y</td>
          <td>Box</td>
        </tr>
        <tr>
          <td>x</td>
          <td>y</td>
          <td>2</td>
          <td>z</td>
          <td>Axe</td>
        </tr>
        <tr>
          <td>y</td>
          <td>z</td>
          <td>7</td>
          <td>x</td>
          <td>Box</td>
        </tr>
        <tr>
          <td>z</td>
          <td>x</td>
          <td>2</td>
          <td>y</td>
          <td>Answer</td>
        </tr>
        <tr>
          <td>x</td>
          <td>y</td>
          <td>7</td>
          <td>z</td>
          <td>Apple</td>
        </tr>
        <tr>
          <td>y</td>
          <td>z</td>
          <td>6</td>
          <td>x</td>
          <td>Year</td>
        </tr>
        <tr>
          <td>z</td>
          <td>x</td>
          <td>2</td>
          <td>y</td>
          <td>Goat</td>
        </tr>
      </tbody>
    </table>

    07-25 23:15
    查看更多