HTML5 / Javascript数据表的顺序/列的排序

时间:2018-11-10 11:06:28

标签: javascript sorting datatables

我当前正在使用http://datatables.net中的数据表。我有许多列包含“未知”数据(即无法预设内容类型)

在使用数据表之前,这只是一个标准的简单表,其中在服务器端使用ASP.NET/C#/LINQ orderby(常规排序)进行排序,并且几乎可以在任何情况下使用。

现在,使用数据表进行排序主要是错误的。特别是数字以及字符串和数字的混合是错误的。

我的错误情况:

  1. 空字符串始终排在第一位,我想让它们排在最后。可以忍受这个。
  2. 数字/货币应正确订购。目前订购是这样的 500,12 400,00 1.123,00 223.441,00

我对这个数据表/ JavaScript世界还很陌生。对于错误情况,我添加了所有我能想到的插件,并且对它们进行了全部测试,但未成功获取正确的列表排序。

我认为我想进行的排序是序数形式(例如ASCII二进制),并且只要我能理解JS如何执行以下操作,就可以实现自己的排序功能:

int c = String.Compare(a, b, StringComparison.Ordinal);

1 个答案:

答案 0 :(得分:0)

前一段时间,数据表也面临类似的挑战。这是日期,带格式的数字以及德语的特殊字符。你的名字听起来像你来自斯堪的纳维亚半岛。我想也许对您也很重要...

您需要以下数据表插件来完成所有这些操作:

该时间用于日期时间排序:https://datatables.net/plug-ins/sorting/datetime-moment还需要我强烈推荐的moment.js。 https://momentjs.com/

该字符用于使用特殊字符(例如ä,öü等)的国际分类https://datatables.net/plug-ins/sorting/intl

这是用于格式化数字排序的: https://datatables.net/plug-ins/sorting/formatted-numbers

以下示例是有关根据用户语言自动检测各个字段的示例。

实施示例:

这是关于格式化数字。英文格式为1,000,000.99。德语格式为1.000.000,99。它还可以处理空白字段。

//sorting of formatted numbers in English and German format
$.extend( $.fn.dataTable.ext.type.order, { 
    "formatted-num-pre": function ( a ) {
        if (lang == 'de') {
            a = a.toString().replace( /[\.]/g, "" );
            a = a.toString().replace( /[\,]/g, "." );
        } else {
            a = a.toString().replace( /[\,]/g, "" );
        }
        a = a.toString().replace( /[^\d.-]/g, "" );
        a = parseFloat(a);
        if ( ! isNaN(a) ) {
            return a;
        } else {
//14 digit negative number to make sure empty cells always stay at the bottom / top
            return -99999999999999;
        }
    },
    "formatted-num-asc": function ( a, b ) {
            return a - b;
    },
    "formatted-num-desc": function ( a, b ) {
            return b - a;
    }
} );

这是关于国际分类的

//sorting:
//Use the phonebook variant of the German sort order, 
//which expands umlauted vowels to character pairs: ä → ae, ö → oe, ü → ue.
if (lang === 'de') {
    $.fn.dataTable.ext.order.intl("de-DE-u-co-phonebk");
} else {
    $.fn.dataTable.ext.order.intl("en-GB");
}

最后这是关于日期排序的:

//should be positioned after the number formatting to make sure
//date columns don't accidentally are assigned formatted-num
//set parms for date sorting using moment.js
$.fn.dataTable.moment( 'L', momentLocale );

在我的示例中,变量momentLocale是'de'或'en-gb'。各自的日期格式为10.11.2018(德语)或10/11/2018(英语)。 (与美国格式的2018年11月10日相反,我认为要求momentLocale为'en')。