数据表总结了过滤后的数据

时间:2013-03-15 12:57:50

标签: jquery jquery-datatables

我在我的网站中使用了datatable jquery插件。一切顺利。

但是我试图通过使用插件脚本列过滤器来增强表格,然后我想总结页脚中的数据。我可以让过滤器正常工作。

用于汇总数据的数据表中的示例仅适用于数据页面或整个数据集。

我找到了这个帖子:http://datatables.net/forums/discussion/2053/fnfootercallback-sum-column-after-filter/p1寻找类似的解决方案。作者建议以下功能:

._('td:nth-child(4)', {"filter": "applied"})

这显然返回了过滤数据的对象。但是,一旦我有了这个,我不知道从哪里开始添加数据

目前我的数据表脚本(为了帖子而缩短)看起来像这样:

table.dataTable({...


    "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {

        /*
                     * Calculate the total sales for the table (ie inc. outside
                     * the pagination)
                     */
        var iTotalSales = 0;
        for ( var i=0 ; i<aaData.length ; i++ )
        {
            iTotalSales += aaData[i][2]*1;
        }

        /* Calculate the total sales on this page */
        var iPageSales = 0;
        for ( var i=iStart ; i<iEnd ; i++ )
        {
            iPageSales += aaData[ aiDisplay[i] ][2]*1;
        }

        /* Modify the footer row to match what we want */
        var secondRow = $(nRow).next()[0];
        var nCells = secondRow.getElementsByTagName('td');
        nCells[0].innerHTML = accounting.formatMoney(iPageSales, "£ ", 2) +
                ' Page Total ('+ accounting.formatMoney(iTotalSales, "£ ", 2) +' Total Sales)';
    }

})
        .columnFilter({
            aoColumns: [ { type: "date-range" },
                null,
                { type: "text"  },
                { type: "text"  },
                { type: "select"  },
                { type: "select"  }
            ]

        })
        ._('td:nth-child(4)', {"filter": "applied"});

我目前有一个如上所述的摘要,它显示页面上过滤的总数与表格总数(所有数据不仅仅是过滤的)

我是一个jquery新手 - 我不知道从哪里开始操纵最后一次调用中创建的对象

谢谢

2 个答案:

答案 0 :(得分:4)

当你运行._('td:nth-child(4)', {"filter": "applied"})时,你会得到一个返回给你的那一列数值的数组。因此,如果您的表在过滤后看起来像这样:

col 1 | col 2 | col 3 | col 4
foo   | blah  |   $18 |   154
bar   | blech |    $2 |   109

...然后是以下命令

var col4 = $('#mytable').dataTable()._('td:nth-child(4)', {"filter": "applied"})

...会给你col4 = [154, 109]。从那里,您只需遍历col4以对其值求和,然后在适当的位置手动将结果插入页脚行。

答案 1 :(得分:2)

在数据表1.10中,您可以使用api中的columns方法。请注意,只有在调用.DataTable而不是.dataTable时才存在。因为我正在迁移旧的数据表代码,所以它绊倒了一个小时。

下面的示例创建一个数据表,然后绑定在重新计算页脚时执行的函数。重新计算页脚时,该函数将在表中搜索包含成本的列。然后,它汇总了此列中的值:

  1. 数据表当前页面列中显示的数据。
  2. 列中表格中的所有数据。
  3. 符合筛选条件的行中存在的列中的数据。
  4. 请参阅变量searchTotalData:)

    var dataTable = $('#csvtable').DataTable({
        'footerCallback': function(row, data, start, end, display){
            var api = this.api();
            var intval = function(i){
                //Excuse this ugliness, it comes from the datatables sample
                return typeof i === 'string' ? 
                    i.replace(/[\$,]/g, '')*1 :
                    typeof i === 'number' ? 
                        i : 0;
            };
    
            var costColumnIndex = $('th').filter(function(i){return $(this).text() == 'Cost';}).first().index();
            var totalData= api.column(costColumnIndex).data();
            var total = totalData.reduce(function(a ,b){ return intval(a) + intval(b); }, 0) .toFixed(2);
            var pageTotalData = api.column(costColumnIndex, {page: 'current'}).data();
            var pageTotal = pageTotalData.reduce(function(a,b){return intval(a) + intval(b);}, 0).toFixed(2);
            var searchTotalData = api.column(costColumnIndex, {'filter': 'applied'}).data();
            var searchTotal = searchTotalData.reduce(function(a,b){return intval(a) + intval(b);}, 0).toFixed(2);
    
            $('#cost').html('Approximate page total $' + pageTotal + ', search total $' + searchTotal + ', totally total $' + total);
        }   
    });