Bootstrap Datatables按部分单元格内容排序

Bootstrap Datatables Sorting by part of cell contents

本文关键字:排序 单元格 Datatables 按部 Bootstrap      更新时间:2023-09-26

我在排序数据表时遇到问题。我有一个列显示了服务器中的玩家,比如"0/50",当我试图对该列进行排序时,它没有正确地对数字进行排序。它将按如下顺序显示:

  • 0/50
  • 10/30
  • 2/40
  • 3/30
  • 4/30
  • 9/25

我只想按第一个数字排序。例如:

  • 0/50
  • 2/40
  • 3/30
  • 4/30
  • 9/25
  • 10/30

我知道这可能可以通过将两个值分隔到各自的列中来实现,但出于美学原因,我希望它们在同一列中。

这是我的HTML布局:

<div class="row">
    <div class="col-lg-12">
        <table id="serverList" class="table table-striped table-bordered" cellspacing="0" width="100%">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>Server Infomation</th>
                    <th>Players</th>
                </tr>
            </thead>
        </table>
    </div>
</div>

这是我的Javascript:

$(document).ready(function() {              
            var t = $('#serverList').DataTable();
            $.getJSON('../php/queryAll.php', function(data){
                var server = [];
                $.each( data, function( key, val ) {
                    $.each( val, function( key2, val2 ) {
                        server.push(val2);
                    });
                    String.prototype.replaceAll = function(str1, str2, ignore){return this.replace(new RegExp(str1.replace(/(['/','!'''^'$'{'}'[']'(')'.'*'+'?'|'<'>'-'&])/g,"''$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/'$/g,"$$$$"):str2);}
                    if(server[14] > 0)
                    {
                        hostName = server[1].replaceAll('[','<span style="color:#');
                        server[1] = hostName.replaceAll(']',';">');
                        t.row.add( [server[0],server[1],server[8] + ' / ' + server[7]]).draw( false );
                    }
                    server = [];
                });
                $("#loader").fadeOut(250, function(){
                    $(".row").fadeIn(1000);
                });
            });
        });

感谢您提供的任何帮助。

正如其他人所提到的,问题是数据表由于斜杠而使用字符串排序。

我解决这个问题的方法是在一个隐藏的跨度中添加数值。你只需要记住让所有的值都具有相同的长度,因为它们仍然会被排序为字符串。您可以通过附加0来完成此操作。

举个例子[假设我知道我的号码永远不会超过100]:

<td><span style="display:none">024</span>24/60</td>
...
<td><span style="display:none">001</span>1/60</td>
...
<td><span style="display:none">051</span>51/60</td>
...
<td><span style="display:none">033</span>33/60</td>

升序,即使是字符串,也会产生1、24、33、51

如果你在数字后面添加单词,你也可以使用这个技巧:

<td><span style="display:none">050</span>50 Hours</td>

您可以使用HTML5 data-*属性对数据表进行排序。即数据顺序属性。

<tr>
    <td data-order="0">0 / 50</td>
    [...]
</tr>
<tr>
    <td data-order="10">10 / 30</td>
    [...]
</tr>

最初显示的排序顺序是正确的。该列包含一个字符串,排序顺序基于该列中各种字符串的ASCII值。

您想要的是数字顺序排序。但是,如果显示的列包含数值,则最终会得到除法的结果。可能不是你想要的!

您可以按照@markpsmith的建议对隐藏列进行排序,也可以使用带有或不带有类型检测的DataTables排序插件进行探索:

参考:

分拣插件