Tablesorter-按姓氏排序,忽略中间/优先名称

时间:2016-07-05 17:49:17

标签: javascript regex tablesorter

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

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

不幸的是,有一些人有一个首选的名字,会出现在表格中:

[FirstName(PreferredName)LastName]

排序最终只按名字排序。

例如它的排序如下:

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

但我希望它只使用姓氏:

亚历克斯亚当斯 布鲁斯布莱克 凯特琳克鲁兹
Elaine Evans
亚当(戴夫)弗朗西斯
罗伯特(鲍勃)罗孚

我真的没有完全掌握正则表达式,所以我不确定是否有一种简单的方法可以使它在Lastname上排序。

任何帮助(包括有关如何替换。(正则表达式)工作的一些解释,将不胜感激!

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

相反,请尝试使用此解析器。它使用数组操作将姓氏移到前面(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'
  });
});

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

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