使用 Jquery TableSorter,我正在创建一个自定义解析器来对<td>
包含“'#' year(s) * '#' month(s)”的经过时间进行排序。当我使用该功能时
$('.techtable td:nth-child(6)').each(function(){
// console.log($(this));
var that = $(this).text();
var myRegexp = /([\d]+) ([\w]+)(?: ([\d]+) ([\w]+))?/;
var match = myRegexp.exec($(this).text());
console.log(match);
});
在命令行中,每个索引都包含一个长度为 5 的数组,如下所示:
["7 months", "7", "months", undefined, undefined]
对此:
["3 years 3 months", "3", "years", "3", "months"]
取决于经过的时间是否只有一个月或一年的元素,然后是另一个。解析文本,我用正则表达式收集每个元素,然后用JS测试是否有多个元素,如果只有1个元素,那么它是以“y”还是“m”开头,并返回数字月数,因此解析器可以<td>
按整数形式的月数对 s 进行排序。
解析器将每个元素作为参数“s”传递给函数。当我直接在“s”上尝试正则表达式时,它不会返回长度为 5 的数组,而是将其截断为 3(如果索引 3 是 typeof 'undefined',我是否正在运行截断它的行)。当我使用控制台直接使用此功能时:
$('.techtable td:nth-child(6)').each(function(){
// console.log($(this));
var that = $(this).text();
var myRegexp = /([\d]+) ([\w]+)(?: ([\d]+) ([\w]+))?/;
var match = myRegexp.exec($(this).text());
if (typeof match[3] == 'undefined') {match.length = 3;};
console.log(match);
});
正则表达式正确返回数组,如果数组只有 1 个元素(年或月),则将其截断。这是自定义解析器的代码:
var myRegexp = /([\d]+) ([\w]+)(?: ([\d]+) ([\w]+))?/;
var match = myRegexp.exec(s);
var order = [];
console.log(match);
if (typeof match[3] == 'undefined') {match.length = 3;};
// 1 element case:
// month
if (match.length = 3) {
if (match[2][0] == "m") {
order.push(match[1]);
}
// year
if (match[2][0] == "y") {
order.push(match[1]*12);
}
// both elements
} else {
order.push(match[1]*12 + match[3]);
}
s = order;
return s;
},
小提琴就在这里。Elapsed 解析器是 JS 面板底部的第二个。如您所见,由于我无法从数组中获取月份(索引 4 和 5),因此无法计算月份,因此排序仅包含年份,并且月份按其原始 HTML 位置排序。我错过了什么?(我正在学习......所以方向比修复更受赞赏,但我不会拒绝它。)
是的,我意识到 JS 小提琴已加载(第一部分是 TableSorter,以维护验证功能(单击标题进行排序),但您需要关注的是代码的最后一部分(参考 '//Table Sorter dateSorter ' 看看正确的解析器应该是什么样子。'//Table Sorter elapsedSorter'部分是我两次尝试的地方,第一部分是我在控制台中使用的工作代码,第二部分是解析器,即以某种方式删除数组中的最后两个索引,从而丢失要计算的月份信息。
猜猜我必须添加正则表达式,并且个人评分为 1,因为我已经浪费了几乎一整天的时间。