2016-11-23 73 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>. 

它是一個黑客?也許,但這個問題的解決方案很快。