【问题标题】:Datatables multi-column sort - help required with specification数据表多列排序 - 规范所需的帮助
【发布时间】:2015-02-27 06:29:50
【问题描述】:

这是我第一次尝试对数据表进行多列排序,我只需要一些帮助来确定我指定的内容是否会按照我想要的方式工作。

我有下表。

我想要的是数据表:

  • 按第三列(Conn 状态)降序排序,然后进行二次排序。如果第三列是可排序的,则不需要应用为后续列指定的排序规则。
  • 如果第三列具有所有相同的值,因此无法应用排序,我希望它按第 5 列 desc (mdi) 排序,然后进行二次排序。如果第五列是可排序的,则不需要应用为后续列指定的排序规则。
  • 如果第五列具有所有相同的值,因此无法应用排序,我希望它按第 7 列 (DSM) desc 排序,然后进行第二次排序。如果第七列是可排序的,则不需要应用为后续列指定的排序规则。
  • 如果第七列具有所有相同的值,因此无法应用排序,我希望它按第 1 列 (SiteId) asc 排序。

这是我迄今为止所尝试的,但如果可能的话,我希望得到一些帮助。另外如何指定排序的 desc 部分(目前我只能弄清楚 asc。

  $("#storeHealthTbl").dataTable ({
      "bSort": true,
      "bLengthChange": false,
      "bPaginate": false,
      "aoColumnDefs": [ {
          "aTargets": [ 2 ],
          "sType": "string",
          "aDataSort": [ 2, 4, 6 ] /* Want 2,4,6 to be desc but don't know how*/
      }, {
          "aTargets": [ 4 ],
          "sType": "string",
          "aDataSort": [ 4, 6 ] /* Want 4,6 to be desc but don't know how*/
      }, {
          "aTargets": [ 6 ],
          "sType": "string",
          "aDataSort": [ 6 ] /* Want 6 to be desc but don't know how*/
      }, {
          "aTargets": [ 0 ],
          "sType": "numeric",
          "aDataSort": [ 0 ] /* This one is asc */
      }, ]
  });

我还应该提到,其中包含图像的列在某些时候会有一个字母“X”,因此这就是我期望的排序方式。如果没有“X”并且它们都是绿色图像(即不是字母字符”,那么我想跳到我指定的下一个类别)。

希望这是有道理的。

我正在使用数据表 1.9.4。

谢谢

【问题讨论】:

  • 要明确一点,如果第 4 列有不同的值并且可以排序,那么排序应该在那里结束还是第 7 列也应该排序?
  • 你使用的是什么版本的 DataTables,相信我,这很重要。
  • 我会在几个小时内得到我的版本的答案,也会澄清你的过度问题。坐等到那时
  • 我已经用数据表的版本更新了我的帖子,并且我还稍微更改了我的代码 sn-p 以正确反映我正在尝试做的事情。如果第 5 列(MDI)有不同的值并且可以排序,那么排序规则应该是 [4 desc, 6 desc] 并且排序可以在那里结束。这也适用于所有其他规则。一旦满足其中一个规则,排序就可以停止(但仍应应用二次排序)。我已更新发布以尝试解释这一点。
  • 你能解释一下你所说的“后面是二次排序”是什么意思吗?或者更确切地说,您能否列出每个规则应应用的二级排序?

标签: jquery datatable


【解决方案1】:

我找不到任何可以完成这种条件排序的内置功能。如果您不介意使用锤子的程序化等效项,下面应该可以解决问题。

请注意,我可能没有适合您想要的排序顺序,但您可以轻松更改。

这是working jsfiddle

// function to check our conditions and set the proper sort order
function getSortOrder(sortCols, sortVars) {
    var set = false;
    // loop through our array of columns to check
    $.each(sortCols, function(ind, elm) {
        // create a var to hold the value in this column on the first row
        var firstVal;
        // loop through each row
        $("#datatable").find('tr').each(function(tri, tre) {
            // stop checking if we already found a column with different values
            if (!set) {
                // otherwise, et get the value in this column on this row
                var curCellVal = $(this).find('td').eq(sortCols[ind]).text();
                // row 0 is a header row, do nothing 
                if (tri == 0) { 
                } else if (tri == 1) { // for first actual row, set `firstVal` to its value
                    firstVal = curCellVal;
                } else { // if after first row, check current row's cell value against 'firstVal'
                    // if the values are different, this column can be sorted, 
                    if (curCellVal != firstVal) {
                        // flag as set so the function stops looking
                        // this could probably be done better
                        set = true; 
                         // initialize datatable with the sort order at the current index of `sortVars`
                        initDTWithSortOrder(sortVars[ind]);
                    }
                }
            }
        });
    });
    // default initialization if not caught by our function
    var datatable = set ? null : $("#datatable").dataTable(); 
};
// `getSortOrder()` takes two parameters
// parameter 1: array: columns to check
// parameter 2: array: sort values (each being a  muti-dimensional array: [column, direction] )
getSortOrder([2, 6, 8, 0], [
    [[2, 'desc'],[4, 'desc'],[6, 'desc']], // sort order to use is column 3 is not all the same value
    [[4, 'desc'],[6, 'desc']],             // sort order to use is column 7 is not all the same value
    [[8, 'desc']],                         // sort order to use is column 9 is not all the same value
    [[0, 'asc']],                          // sort order to use is column 1 is not all the same value
]);

function initDTWithSortOrder(sortOrder) {
    $("#datatable").dataTable({
        "bSort": true,
        "bLengthChange": false,
        "bPaginate": false,
        "aaSorting": sortOrder
    });
}

【讨论】:

  • 谢谢。这就是我需要的。对于我和其他人来说,这是一个很好的教程,可以了解更多关于数据表的信息。但它也帮助我掌握了一些通用的 jquery 知识。
猜你喜欢
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2011-11-15
  • 2011-03-25
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多