2016-11-23 71 views
1

我有一个非常简单的数据表设置,有几个字段和几行数据。列排序已设置。我有一个基本上是“客户名称”的领域,并且它的名字和最后都是。我想知道是否有方法来改变数据表排序方法,以便根据同一列中的姓氏(或最后一个词)进行排序。如果名字和姓氏在同一字段数据表中,按姓氏排序

+0

[为jQuery数据表实现自定义sSortType和排序函数]可能的重复(http://stackoverflow.com/questions/20759814/implementing-a-custom-ssorttype-and-sort-function-for-jquery-datatables ) – mascoj

回答

0

更新
首先答案是通用的排序功能,我莫名其妙地错过了datatables标签。更新的答案是datatables

Like @Stephen P表示在评论中可以配置datatables对隐藏列进行排序。所以你可以只添加姓氏的隐藏列,然后按第二列(姓氏)设置第一列(全名)的顺序。 我已经使用js从全名生成姓氏列,但如果你有很多数据,你应该在服务器端做。

$(document).ready(function() { 
 
    // find full name, get surname and add it to table as second column 
 
    $('#example td:first-child').each(function() { 
 
     $('<td>'+$(this).text().split(' ')[1]+'</td>').insertAfter($(this)); 
 
    }); 
 
    // configure sorting 
 
    $('#example').DataTable({ 
 
     'columnDefs': [ 
 
      {'orderData':[1], 'targets': [0]}, 
 
      { 
 
      'targets': [1], 
 
      'visible': false, 
 
      'searchable': false 
 
      }, 
 
     ], 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script> 
 
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.12/css/jquery.dataTables.min.css"> 
 

 
<table id="example" class="display" width="100%" cellspacing="0"> 
 
     <thead> 
 
      <tr> 
 
       <th>Name</th> 
 
       <th>Surname</th> 
 
       <th>Position</th> 
 
       <th>Office</th> 
 
       <th>Age</th> 
 
       <th>Start date</th> 
 
       <th>Salary</th> 
 
      </tr> 
 
     </thead> 
 
     <tfoot> 
 
      <tr> 
 
       <th>Name</th> 
 
       <th>Surname</th> 
 
       <th>Position</th> 
 
       <th>Office</th> 
 
       <th>Age</th> 
 
       <th>Start date</th> 
 
       <th>Salary</th> 
 
      </tr> 
 
     </tfoot> 
 
     <tbody> 
 
      <tr> 
 
       <td>Tiger Nixon</td> 
 
       <td>System Architect</td> 
 
       <td>Edinburgh</td> 
 
       <td>61</td> 
 
       <td>2011/04/25</td> 
 
       <td>$320,800</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Garrett Winters</td> 
 
       <td>Accountant</td> 
 
       <td>Tokyo</td> 
 
       <td>63</td> 
 
       <td>2011/07/25</td> 
 
       <td>$170,750</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Ashton Cox</td> 
 
       <td>Junior Technical Author</td> 
 
       <td>San Francisco</td> 
 
       <td>66</td> 
 
       <td>2009/01/12</td> 
 
       <td>$86,000</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Cedric Kelly</td> 
 
       <td>Senior Javascript Developer</td> 
 
       <td>Edinburgh</td> 
 
       <td>22</td> 
 
       <td>2012/03/29</td> 
 
       <td>$433,060</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Airi Satou</td> 
 
       <td>Accountant</td> 
 
       <td>Tokyo</td> 
 
       <td>33</td> 
 
       <td>2008/11/28</td> 
 
       <td>$162,700</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Brielle Williamson</td> 
 
       <td>Integration Specialist</td> 
 
       <td>New York</td> 
 
       <td>61</td> 
 
       <td>2012/12/02</td> 
 
       <td>$372,000</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Herrod Chandler</td> 
 
       <td>Sales Assistant</td> 
 
       <td>San Francisco</td> 
 
       <td>59</td> 
 
       <td>2012/08/06</td> 
 
       <td>$137,500</td> 
 
      </tr> 
 
     </tbody> 
 
    </table>

+2

虽然您对自定义排序功能是正确的,但这可能是一种解决方法,我谨慎反对将空间名称拆分,这会在某些情况下导致错误结果。 DataTables允许您将任意数据附加到行,并且即使它没有显示,您也可以对其进行排序,因此请单独附上实际的姓氏。或者,您实际上可以分别传递姓名和姓氏,然后使用自定义渲染器将它们粘贴在一起以显示在单个列中。 –

+0

@StephenP,你应该添加你的评论作为答案。 –

+1

@ Gyrocode.com - 是的,谢谢,已经做到了。 –

0

如果你想处理这个在DB层,你将需要查询的排序依据子句中执行子串的方法,语法会有所不同,你使用的是什么DB 。

MSSQL:

ORDER BY SUBSTRING(COLUMN, CHARINDEX(' ', COLUMN), 50); 

MYSQL:

ORDER BY Substring(COLUMN, Position(' ' IN COLUMN), 50); 
1

当你说得对,自定义排序功能,这可能是要走的路,我告诫不要对空间拆分的名字,在某些情况下会导致错误的结果。

DataTables允许您将任意数据附加到行,并且即使它未显示,也可以按此排序,因此请单独附上实际的姓氏。或者,您实际上可以分别传递姓名和姓氏,然后使用自定义渲染器将它们粘贴在一起以显示在单个列中。

1

另一个简单的建议是,当名字姓氏需要单列时,但您想对姓氏排序:在WordPress或其他php应用程序中,将“姓名”列设置为:

<td>last-name first-name last-name</td>. 

然后,该列将按姓氏排序。

然后,把最后的名字的第一个实例为

<span class="display-none">last-name</span>. 

它是一个黑客?也许,但这个问题的解决方案很快。

相关问题