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>
我目前正在使用 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>