如何按日期列过滤jquery数据表?

时间:2016-11-21 20:39:39

标签: javascript datatable datatables datatables-1.10

我有一个数据表,我试图根据一列中的日期过滤。我想根据具有一年或更早的日期的lastModified列过滤数据,但即使在某个硬编码日期过滤它也是一个好的开始。字符串格式的数据,所以我试图使用新的Date()函数转换为日期。

var table = $('#database').DataTable( {
        fixedHeader: true,

        data: dataSet,
        columns: [
        { data: "processName" },
        { data: "processLob" },
        { data: "processOwner"},
        { data: "RiskReviewer"},
        { data: "lastModified"}]
        } );

        var filteredData = table
        .column( { data: "lastModified"} )
        .data()
        .filter( function ( value, index ) {
        return new Date(value) < 2015-10-10 ? true : false;
        } );

1 个答案:

答案 0 :(得分:0)

您要做的第一件事是为您的日期列添加“columnDefs”对象,并将其类型指定为“date”。只要您遵循众所周知的格式,DateTables就会内置日期解析。 ColumnType API Def

如果这不能完全实现,那么您将需要在刚刚创建的新columnDef对象上为数据列定义渲染函数。在那里,您可以检查渲染类型,并为其他所有内容返回显示和原始数据值(理想情况下为Date类型的值)的“nice”值。 Render API Defintion

另外一些一般建议不要试图打击图书馆。它实际上非常灵活,可以处理很多。因此,尽可能使用内置的API函数。当人们尝试使用JQuery手动操作表时,通常会出现问题。在幕后,DataTables插件保持了大量的状态,从未进入DOM。基本上,如果API中有一个函数,请使用它。

编辑:即使他找到了另一种解决方案,也可以在原始海报问题上添加答案。

要记住的一件事是“过滤器”仅用于返回过滤后的数据集。它不会改变网格中的显示。相反,您将需要在“column()”API项上使用“搜索”来过滤DataTable中显示的行。

然而,这有一个小问题。搜索方法只接受常规值而不是函数。因此,如果您想实现这一点,您可以提供如下自定义搜索功能:

// The $.fn.dataTable.ext.search array is shared amongst all DataTables and 
//  all columns and search filters are evaluated in the order in which they 
//  appear in 
//  the array until a boolean value is returned.  
$.fn.dataTable.ext.search.unshift(function(settings, data, dataIndex) {
     // Using a negative value to get the column wraps around to the end of 
     // the columns so "-1" will always be your last column.
     var dateColumn = $(this).column(-1);

     // We get the data index of the dateColumn and compare it to the index
     // for the column currently being searched.
     if(dateColumn.index() !== dataIndex) {'
        // Pretty sure this indicates to skip this search filter
        return null;
     }

     var columnSearchingBy = $(this).column(dataIndex);

     // Allows the data to be a string, milliseconds, UTC string format ..etc
     var columnCellData = new Date(data.lastModified);
     var valueToSearchBy = new Date(columnSearchingBy.search.value);

     // Ok this is one of the worst named methods in all of javascript.   
     // Doesn't actually return a meaningful time.  Instead it returns the a 
     // numeric value for the number of milliseconds since ~ 1970 I think.  
     //
     // Kind of like "ticks()" does in other languages except ticks are 
     // measured differently.  The search filter I am applying here is to 
     // only show dates in the DataTable that have a lastModified after or 
     // equal the column search.
     return (valueToSearchBy.getTime() >= columnCellData.getTime());
});


// So this should use our fancy new search function applied to our datetime
// column.  This will filter the displayed values in the DataTable and from 
// that just a small filter on the table to get all the data for the rows 
// that satisfy the search filter.
var filteredData = table
        .column({ data: "lastModified"})
        .search('2015-10-10')
        .draw();

即使你找到了另一种方法,也许上面的内容可能会帮助你。