【问题标题】:Sorting by surname if first and lastname are in the same field datatable如果名字和姓氏在同一字段数据表中,则按姓氏排序
【发布时间】:2016-11-23 17:19:51
【问题描述】:

我有一个非常简单的数据表设置,其中包含几个字段和几行数据。列排序已设置。我有一个基本上是“客户名称”的字段,其中包含名字和姓氏。我想知道是否有办法将数据表排序方法更改为根据同一列中的姓氏(或最后一个单词)进行排序。

【问题讨论】:

标签: javascript datatables


【解决方案1】:

现在的方法是简单地将data-sort 属性附加到您的<td>,例如:

<td data-sort="Johnson Dwayne">Dwayne "The Rock" Johnson</td>

数据表会以您期望的方式自动处理这个问题。如需参考,请参阅他们的documentation on HTML5 data-* attributes

【讨论】:

    【解决方案2】:

    虽然您对自定义排序功能的看法是正确的,而且这可能是可行的方法,但我提醒您不要将名称拆分为空格,这在某些情况下会导致错误的结果。

    DataTables 允许您将任意数据附加到行,即使它没有显示,您也可以按该数据排序,因此请单独附加实际姓氏。

    或者,您实际上可以分别传递名字和姓氏,然后使用自定义渲染器将它们粘贴在一起以显示在单个列中。

    【讨论】:

      【解决方案3】:

      另一个简单的建议是当 First-Name Last-Name 需要单个列,但您想按姓氏排序:在 WordPress 或其他 php 应用程序中,将“Name”列设为:

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

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

      然后,将 last-name 的第一个实例设为

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

      这是一个黑客吗?也许可以,但可以快速解决问题。

      【讨论】:

        【解决方案4】:

        如果您想在 DB 层处理此问题,则需要在查询的 orderby 子句中执行 Substring 方法,语法将根据您使用的 DB 有所不同。

        MSSQL:

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

        MYSQL:

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

        【讨论】:

          【解决方案5】:

          更新
          第一个答案是通用排序功能,我不知何故错过了datatables 标签。更新后的答案适用于datatables

          就像 @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>

          【讨论】:

          • 虽然您对自定义排序功能的看法是正确的,而且这可能是要走的路,但我警告不要在空格上拆分名称,这在某些情况下会得到不正确的结果。 DataTables 允许您将任意数据附加到行,即使它没有显示,您也可以按其排序,因此单独附加实际的姓氏。或者,您实际上可以分别传递名字和姓氏,然后使用自定义渲染器将它们粘贴在一起以显示在单个列中。
          • @StephenP,您应该添加您的评论作为答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-05-06
          • 2016-02-22
          • 1970-01-01
          • 2015-04-13
          • 1970-01-01
          • 2021-09-03
          • 1970-01-01
          相关资源
          最近更新 更多