Tablesorter- 按姓氏排序,忽略 middle/preffered 姓名

Tablesorter- Sort by Last name, ignore middle/preffered name

我目前正在使用 Mottie 的 tablesorter 版本来构建目录。我在同一个 table 单元格中有一个名称字段(名字和姓氏的组合)。大多数数据条目都很简单(Firstname LastName),我设置了代码,以便通过使用以下方式交换姓氏和名字来排序:

textExtraction: { 0: function(node) { // swap first and last name for sorting return $.trim($(node).text() || '').replace(/(\w+)\s(\w+)/g,' '); } }

不幸的是,有些人有一个首选的名字,并且会出现在 table 中,例如:

[名字(首选名称)姓氏]

排序最终只按名字排序。

例如排序如下:

亚历克斯·亚当斯
罗伯特(鲍勃)漫游者
布鲁斯·布莱克
凯特琳·克鲁兹
亚当(戴夫)弗朗西斯
伊莱恩·埃文斯

但我希望它只使用姓氏,例如:

亚历克斯·亚当斯
布鲁斯·布莱克
凯特琳·克鲁兹
伊莱恩·埃文斯
亚当(戴夫)弗朗西斯
罗伯特(鲍勃)流浪者

我并没有真正完全掌握正则表达式,所以我不确定是否有一种简单的方法可以让它始终按姓氏排序。

如有任何帮助(包括对此 replace.(regex) 的工作原理的一些解释),我们将不胜感激!

谢谢!

您需要设置正则表达式来检测首选名称(如果存在)。使用 ? 量词。

/* other stuff before the replace function */.replace(/(\w+)\s((?:\(\w+\)\s)?\w+)/g, ' ')

虽然,如果输出必须 space 分隔,(并且条目并不总是 space 分隔),则需要另一个 replace:

.replace(/\)\s/g, ') ')

我不会使用 textExtraction 方法,因为它适用于所有 table 个单元格。

相反,试试这个解析器。它使用数组操作将姓氏移到前面 (demo)

$(function() {

  $.tablesorter.addParser({
    id: 'last-name',
    is: function() {
      return false;
    },
    format: function(str) {
      var parts = (str || '').split(/\s+/),
        last = parts.pop();
      parts.unshift(last);
      return parts.join(' ');
    },
    // set type, either numeric or text
    type: 'text'
  });

  $('table').tablesorter({
    theme: 'blue'
  });
});

不要忘记添加 class 名称来设置解析器:

<th class="sorter-last-name">Name</th>