【问题标题】:Sorting a HTML table on a column whose sortable value is not displayed. Any existing solutions?在未显示可排序值的列上对 HTML 表进行排序。任何现有的解决方案?
【发布时间】:2016-10-30 01:38:38
【问题描述】:

我知道那里有很多表格分类器。例如,tablesorter、datatables 等。但我没有找到任何可以根据内部关联值对列进行排序的东西。易于解释的示例:日期和时间被检索为简单的 UNIX 整数时间,但使用可能不提供升序或降序日期的格式化字符串格式化显示,如果按 ASCII 显示字符串排序。例如。在 2011 年 12 月 31 日这样显示的日期上进行排序将不会提供时间排序。我知道排序排序器中有专门按日期排序的选项,但我正在为超出标准类型(如日期)的数据类型寻找通用解决方案。

欢迎提出任何建议。我想在 JQuery 中编码。我更多的是寻找一种算法方法,而不是如何编码。例如,在哪里维护隐藏值?例如,列的“td”中的 Data-xxx 属性,并且在该列的“th”中将相同的属性设置为布尔 Y 或 N,以指示显示的排序类型或数据值?

如果存在现有解决方案,请提及。我没有找到任何东西,但我可能又错过了一个。

【问题讨论】:

  • 如果您使用data-date="2012-11-30",您可以按数字顺序对其进行排序。但是您是否考虑过使用 MySQL 对数据进行排序?
  • MySQL 中的排序与浏览器排序不同。在 Mysql 中排序时,你会得到,假设有 200 条记录在字段 f1 上排序。您在页面中显示前 15 条记录(数据分页)。现在用户想要在浏览器中的字段 f3 上对这 15 条记录进行排序。这就是我所指的问题。请参阅@Martinez 的 cmets。您将从建议的解决方案中了解问题。无论如何,谢谢你的建议是合乎逻辑的。

标签: jquery html sorting html-table hidden


【解决方案1】:

我使用 Jquery 数据表 (http://datatables.net/)。您可以扩展插件以添加新的“数据格式”。

例子:

我来自西班牙,日期用以下格式表示:dd/mm/yyyy hh:mm:ss。

如果我使用插件用来排序日期的排序器,日期就像字符串一样排序(插件假设数据格式为 yyyy-mm-dd hh:mm:ss)。

您必须执行一个函数来返回一个整数,该整数是日期的“权重”,“20/10/2013”​​的权重小于“15/11/2013”​​,因此 20/10/2013 小于2013 年 15 月 11 日。

对于dd/mm/yyyy的格式,计算权重的函数是:(可以改成mm/dd/yyyy改变frDateParts的索引)

function dateHeight(dateStr){
        if (trim(dateStr) != '') {
                var frDate = trim(dateStr).split(' ');
                var frTime = frDate[1].split(':');
                var frDateParts = frDate[0].split('/');
                var day = frDateParts[0] * 60 * 24; /*<--- in mm/dd/yyyy is frDateParts[1]*/
                var month = frDateParts[1] * 60 * 24 * 31; /*<--- in mm/dd/yyyy is frDateParts[0]*/
                var year = frDateParts[2] * 60 * 24 * 366;
                var hour = frTime[0] * 60;
                var minutes = frTime[1];
                var x = day+month+year+hour+minutes;
        } else {
                var x = 99999999999999999; 
        }
        return x;
}

以及插件的扩展名:

/* NOTE: the new format is called "date-euro" (why not? xD) so:
you have to do the "date-euro-asc" for ascendent order and the "date-euro-desc"
 for descendent order. the return of the function has to be 
-1 (lesser), 0 (equal) or 1 (greater)*/

jQuery.fn.dataTableExt.oSort['date-euro-asc'] = function(a, b) {
        var x = dateHeight(a);
        var y = dateHeight(b);
        var z = ((x < y) ? -1 : ((x > y) ? 1 : 0));
        return z;
};

jQuery.fn.dataTableExt.oSort['date-euro-desc'] = function(a, b) {
        var x = dateHeight(a);
        var y = dateHeight(b);
        var z = ((x < y) ? 1 : ((x > y) ? -1 : 0));
        return z;
};

当您使用 datetables 插件定义该列的表时:

 { "sType": "date-euro"},

示例(包含 5 列的表(Int、string、Date、string、string):

  "aoColumns": [
         { "sType": 'numeric' },
           null,
           { "sType": "date-euro"},
           null,
           null 
     ],

【讨论】:

  • 我查看了 Datatables,但对于我的简单要求而言,它有点偏重。我自己做了很多分页和 AJAX,而且我必须做很多自定义的繁重工作。 Tablesorter 非常适合,但没有选项(或者我会再看一次)有一个钩子来赋予单元格值权重。你的回答很有用。如果没有其他更好的解决方案,我会接受你的回答。我赞成它,因为它肯定很有用。
  • 我没有使用tablesorter,但是使用tablesorter你可以指定日期的格式:mottie.github.io/tablesorter/docs/…也许某些格式可以帮助你。
  • 我想要一个通用的解决方案,虽然那是我使用的一个例子,但不是迄今为止特定的。一种方法是在显示的数据前面加上一些不可见的“重量”字符串,该字符串是 ascii 可排序的,但在显示中将其显示设置为无。我将不得不使用它来查看排序如何与内部显示一起工作:在 td 标记内放置无权重 HTML 标记。也许您也可以在您给出的示例中使用这种方法。我根本没有尝试过这种方法......只是想到了它。现在试试看。
  • Tablesorter 有一个简单的解析器方法可以为我解决这个问题。之前错过了。与 Datatables 相比,Tablesorter 是轻量级的。我会更仔细地看一下数据表。
【解决方案2】:

是的,解决方案是存在的。您必须在 html 中使用简单的 jquery table-sorter。它在开发时也很有用。 您可以轻松地对所有字段或一个字段进行排序。

jQuery Table Sorter

【讨论】:

  • 我认为您没有理解这个问题。请参阅@Pablo Martinez 回答以了解详细信息。他的问题肯定是对的。
猜你喜欢
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2014-03-17
  • 2017-10-04
  • 2014-09-19
相关资源
最近更新 更多