【问题标题】:Sort table in HTML by column with date values desc using only javaScript仅使用 javaScript 按具有日期值 desc 的列对 HTML 中的表进行排序
【发布时间】:2016-08-11 15:33:43
【问题描述】:

是否可以只使用 javaScript 来制作排序功能,而无需任何其他库进行排序?

假设我有一个表,它是具有以下格式的日期值的第一列:MM/dd/yyyy。表格还有两列,如下所示:

<table id="results" width="360" border="1">
    <thead>
      <tr>
        <th scope="col" width="120">Date Created</th>
        <th scope="col" width="120">Name</th>
        <th scope="col" width="120">Tests</th>
      </tr>
      <tr>
        <td>07/08/2015</td>
        <td>Test Name</td>
        <td>Raven</td>
      </tr>
      <tr>
        <td>05/04/2015</td>
        <td>Test Name 4</td>
        <td>Raven 3</td>
      </tr>
      <tr/>
        <td>01/08/2017</td>
        <td>Test Name 2</td>
        <td>PCT</td>
      </tr>
    </thead>
</table>

是否可以说添加一个按钮,并在单击事件时按日期列中的值对行进行排序?

我必须只使用普通的 javaScript 和 HTML 来完成这个,所以很遗憾没有 jQuery :(

【问题讨论】:

  • 当然有可能,但为什么你必须在没有 jquery 或任何其他 javascript 插件的情况下这样做。这将需要大量的代码。你可以用 jquery sortable 的 1 行代码来做到这一点。
  • @EfeÖzazar 你知道那个神奇的词 - 客户......哈哈这是一个请求......他们喜欢看到我们受苦我猜......我知道使用 jQuery 非常容易,只是几行……但我别无选择……
  • 数据应该在 tbody 元素中吗? (如果标题行不属于同一个父级,它将简化排序...)
  • @nemo_87 他们讨厌我们,我们也讨厌他们 :D 然后开始写作,如果你卡在任何地方,用你的代码更新你的问题。我会跟踪它。我没有时间写这一切,但如果可以的话,我会提供帮助。
  • @nnnnnn 好吧,我们可以将其更改为 tbody,如果它可以简化它...我对普通的 javaScript 仍然很差,所以我不知道我可以用 tbody 做什么,但我会的研究了一下。感谢您的想法:)

标签: javascript sorting


【解决方案1】:

我整理了一些东西给你一些想法。显然,您可以扩展它以按其他数据类型排序。

我在日期比较中“作弊”,只是将字符串格式日期从 20140312 直接更改为八位数字,格式为 "12/03/2014" - 请注意,我假设日期输入格式为 @ 987654323@,所以如果由于某种原因你实际上在使用mm/dd/yyyy,你将不得不调整convertDate() 函数。

我还在您的表格中引入了&lt;tbody&gt;,这样我就可以对数据行进行排序而完全忽略标题行。

function convertDate(d) {
  var p = d.split("/");
  return +(p[2]+p[1]+p[0]);
}

function sortByDate() {
  var tbody = document.querySelector("#results tbody");
  // get trs as array for ease of use
  var rows = [].slice.call(tbody.querySelectorAll("tr"));
  
  rows.sort(function(a,b) {
    return convertDate(a.cells[0].innerHTML) - convertDate(b.cells[0].innerHTML);
  });
  
  rows.forEach(function(v) {
    tbody.appendChild(v); // note that .appendChild() *moves* elements
  });
}

document.querySelector("button").addEventListener("click", sortByDate);
<table id="results" width="360" border="1">
    <thead>
      <tr>
        <th scope="col" width="120">Date Created</th>
        <th scope="col" width="120">Name</th>
        <th scope="col" width="120">Tests</th>
      </tr>
    </thead>
    <tbody>
       <tr>
        <td>04/04/2015</td>
        <td>Test Name 2</td>
        <td>1</td>
      </tr>
      <tr>
        <td>09/08/2017</td>
        <td>Test Name 5</td>
        <td>2</td>
      </tr>
      <tr>
        <td>07/08/2015</td>
        <td>Test Name 4</td>
        <td>3</td>
      </tr>
      <tr>
        <td>05/04/2015</td>
        <td>Test Name 3</td>
        <td>4</td>
      </tr>
      <tr>
        <td>12/08/2017</td>
        <td>Test Name 6</td>
        <td>5</td>
      </tr>
      <tr>
        <td>21/03/2014</td>
        <td>Test Name 1</td>
        <td>6</td>
      </tr>
    </tbody>
</table>
<button>Sort by date</button>

【讨论】:

  • 不错的解决方案! :) 这对我不起作用,因为我在页面上还有一个按钮,所以我猜它没有选择正确的按钮,但我可以更改最后一行,应该没问题 :) 谢谢你! :) @nnnnnn
  • 当然,按钮并不是解决方案的一部分,它是演示的一部分。在排序函数中硬编码表 ID 也不是很理想,但这只是启动和运行它的一种快速方法,以便我可以理解排序概念。你可以在实际项目中整理一下,把排序方向作为函数的参数等等。
  • 是的,我同意,稍后我可以更改它,但最重要的是具有正确的功能 :D 谢谢 :D @nnnnnn
  • 我看不到这个语句 'tbody.appendChild(v);'删除所有元素并从头开始。
  • @Nguaial - 它不会删除元素,它会移动它们。请注意,该语句位于循环内,因此它会移动所有行,一次移动一个。
猜你喜欢
  • 2019-03-05
  • 2021-01-14
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多