【问题标题】:How to sort table by date column如何按日期列对表格进行排序
【发布时间】:2020-01-15 12:15:37
【问题描述】:

我有一张表,我想对日期列进行升序和降序排序。

我已经尝试了下面的代码,但它不起作用。它仅在对数字进行排序时起作用。

function sortColumn() {
        var table, rows, switching, i, x, y, shouldSwitch;
        table = document.getElementById("example");
        switching = true;
        while (switching) {
            switching = false;
            rows = table.rows;
            for (i = 1; i < (rows.length - 1); i++) {
                shouldSwitch = false;
                x = rows[i].getElementsByTagName("TD")[6];
                y = rows[i + 1].getElementsByTagName("TD")[6];
                if (parseInt(x.innerHTML.toLowerCase()) > parseInt(y.innerHTML.toLowerCase())) {
                    shouldSwitch = true;
                    break;
                }
            }
            if (shouldSwitch) {
                rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
                switching = true;
            }
        }
    }

【问题讨论】:

  • 这里有很多值得挑选的地方。首先,parseInt() 将接受一个字符串,如"2",并返回整数2。但它不会处理像"13/09/2018" 这样的字符串,因为它不仅仅是数字字符。工作量更大,但您可以考虑将表数据收集到对象数组中,然后使用排序工具确定排序顺序,然后将数据放回新顺序。

标签: javascript jquery html html-table


【解决方案1】:

这是一个比您一直在寻找的更复杂的示例。它利用了数组排序功能,可以利用可选的compareFunction来进行排序比较。

$(function() {
  function tableToArray(tObj) {
    var result = [];
    var keys = [];
    $("thead th", tObj).each(function(i, el) {
      keys.push($(el).text().trim());
    });
    $("tbody tr").each(function(i, row) {
      var temp = {};
      $.each(keys, function(j, k) {
        temp[k] = $("td", row).eq(j).text().trim();
      });
      result.push(temp);
    });
    return result;
  }

  function replaceTableData(tObj, data) {
    var b = $("tbody", tObj);
    b.html("");
    $.each(data, function(i, row) {
      var r = $("<tr>").appendTo(b);
      $.each(row, function(j, cell) {
        $("<td>").html(cell).appendTo(r);
      });
    });
  }

  function compare(a, b) {
    var dateA = a.Date;
    var dateB = b.Date;
    var result = 0;
    if (dateA > dateB) {
      result = 1;
    } else {
      result = -1;
    }
    return result;
  }

  function sortTable() {
    var tData = tableToArray($("table"));
    tData.sort(compare);
    replaceTableData($("table"), tData);
  }

  $(".sort-column").click(sortTable);

});
.sort-column {
  cursor: pointer;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <thead>
    <tr>
      <th>ID</th>
      <th class="sort-column" data-sort-order="null">Date</th>
      <th>Value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>17/12/1989</td>
      <td>Homer</td>
    </tr>
    <tr>
      <td>2</td>
      <td>07/09/2019</td>
      <td>Marge</td>
    </tr>
    <tr>
      <td>3</td>
      <td>01/09/2019</td>
      <td>Bart</td>
    </tr>
    <tr>
      <td>4</td>
      <td>04/09/2019</td>
      <td>Lisa</td>
    </tr>
    <tr>
      <td>5</td>
      <td>14/09/2019</td>
      <td>Maggie</td>
    </tr>
  </tbody>
</table>

这将根据日期列中的文本进行排序。比较时,您可能会变得更复杂并将日期解析为日期对象。但是对于这种日期格式,它并不是真正需要的。

更新

将代码移动到函数中,以便在 Click 事件中调用它。这是一个非常简单的示例,如果您需要更复杂的操作,请考虑它的工作原理或 DataTables。

【讨论】:

  • 如果我想在单击按钮后对日期列进行排序,我该怎么做?由于日期列仅在此代码之后排序,因此 tData.sort(compare)
  • 我尝试更改月份和年份,但代码仅对日期进行排序
  • @Mary 正如我所建议的,它对每个字符的文本内容进行排序。正如我所提到的,如果要将它们作为日期进行比较,则需要将它们转换为日期对象。
  • 好的,我会努力的。如果我的 Date 列位于表中的第 7 列,我该如何针对上述代码进行具体设置?
  • @Mary 这是绑定到特定类的点击元素,sort-column。排序正在处理Date 索引。如果不清楚,我建议您使用更具体的示例更新您的 OP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多