2

使用 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,因为我已经浪费了几乎一整天的时间。

4

1 回答 1

2
if (match.length = 3) {

你是说这个吗?

if (match.length == 3) {

为了进一步帮助您,当您使用一个常量和一个变量编写条件时,您可以这样编写它们:

if (3 = match.length) {

这现在会导致 JavaScript 错误,而不是默默地变成一个总是产生 true 的赋值。


在 JavaScript 中,12 + '4' == '124',所以你必须小心数字和+运算符。在 PHP 等语言中,您没有这个问题,因为它们有一个用于字符串连接的运算符 ;-)

var myRegexp = /([\d]+) ([\w]+)(?: ([\d]+) ([\w]+))?/;
var match = myRegexp.exec(s);
var order = [];

if (typeof match[3] == 'undefined') {
    if (match[2][0] == "m") {
        order.push(parseInt(match[1]));
    }
    // year
    if (match[2][0] == "y") {
        order.push(parseInt(match[1])*12);
    }
    // both elements
} else {
    order.push(parseInt(match[1])*12 + parseInt(match[3]));
}
s = order;
return s;

顺便说一句parseInt(x, 10),如果您希望字段具有前导零(否则会导致0返回),请使用。谢谢软糖

于 2012-06-14T03:02:38.167 回答