Javascript 将表单元格中的日期模式与jQuery匹配

Javascript 将表单元格中的日期模式与jQuery匹配,javascript,jquery,html-table,Javascript,Jquery,Html Table,我有一个HTML表格,其中的单元格包含遵循特定模式的日期。当一个单元格包含日期时,同一列中的所有单元格都是相同模式的日期。如何使用jQuery匹配格式并返回列?下面是一个示例表,演示了该模式: +-------+-----------+-----------------------+-----------------------+----------+ | Type | Compiled? | Modified (CDT) | Created (CDT) | Pr

我有一个HTML表格,其中的单元格包含遵循特定模式的日期。当一个单元格包含日期时,同一列中的所有单元格都是相同模式的日期。如何使用jQuery匹配格式并返回列?下面是一个示例表,演示了该模式:

+-------+-----------+-----------------------+-----------------------+----------+
| Type  | Compiled? |    Modified (CDT)     |     Created (CDT)     | Priority |
+-------+-----------+-----------------------+-----------------------+----------+
| Fancy | yes       | Oct 18, 2013 16:17:00 | Oct 08, 2013 05:50:32 |       75 |
| Fancy | yes       | Oct 18, 2013 16:16:28 | Oct 18, 2013 15:46:05 |       75 |
| Fancy | yes       | Oct 18, 2013 16:15:25 | Oct 17, 2013 19:04:51 |       75 |
+-------+-----------+-----------------------+-----------------------+----------+

您可以尝试以下方法:

$('table td').filter(function () { return /.../.test($(this).html()); }).map(function () { return $(this).index(); } );
…其中/../是与您要查找的日期格式匹配的正则表达式。这将返回一个列索引数组,其中至少包含该模式的一个匹配项。这不是唯一的列表。如果你只是在寻找一个模式,那么下面的正则表达式就可以工作了,你不一定需要确保它是一个有效的日期

/^\w{3}\s\d+,\s\d{4}\s\d{1,2}:\d{2}:\d{2}$/
(这将与Ziptember第45天的99点相匹配,因此可能会得到一个更好的正则表达式。)

我将把这条密集的线分解一下,以便更好地说明问题:

date_filter = function () { return /^\w{3}\s\d+,\s\d{4}\s\d{1,2}:\d{2}:\d{2}$/.test($(this).html())}

map_td_to_index = function () { return $(this).index(); }

console.log($('table td').filter(date_filter).map(map_td_to_index));
编辑:删除了$.unique的错误用法,该用法仅适用于DOM元素数组。您可以使用以下内容:

$.fn.extend({ unique: function() 
              {
                arr = $.makeArray(this);
                return $.grep(arr, function(elem, idx) 
                                   {
                                     return $.inArray(elem, arr, idx + 1) === -1;
                                   }); 
              } 
            });

然后在调用
map()

之后,只需调用
.unique()
,您可以尝试以下方法:

$('table td').filter(function () { return /.../.test($(this).html()); }).map(function () { return $(this).index(); } );
…其中/../是与您要查找的日期格式匹配的正则表达式。这将返回一个列索引数组,其中至少包含该模式的一个匹配项。这不是唯一的列表。如果你只是在寻找一个模式,那么下面的正则表达式就可以工作了,你不一定需要确保它是一个有效的日期

/^\w{3}\s\d+,\s\d{4}\s\d{1,2}:\d{2}:\d{2}$/
(这将与Ziptember第45天的99点相匹配,因此可能会得到一个更好的正则表达式。)

我将把这条密集的线分解一下,以便更好地说明问题:

date_filter = function () { return /^\w{3}\s\d+,\s\d{4}\s\d{1,2}:\d{2}:\d{2}$/.test($(this).html())}

map_td_to_index = function () { return $(this).index(); }

console.log($('table td').filter(date_filter).map(map_td_to_index));
编辑:删除了$.unique的错误用法,该用法仅适用于DOM元素数组。您可以使用以下内容:

$.fn.extend({ unique: function() 
              {
                arr = $.makeArray(this);
                return $.grep(arr, function(elem, idx) 
                                   {
                                     return $.inArray(elem, arr, idx + 1) === -1;
                                   }); 
              } 
            });

然后在调用
map()

之后,只需调用
.unique()
,是否要从该列检索所有单元格?即使不进行任何分析,您也可以这样做,因为您知道属于一列的所有单元格都具有相同的模式。@f00bar将有其他具有不可预测的列标题和列顺序的表。日期模式是否始终相同?@f00bar是的,它始终相同。因此,是否要从此列检索所有单元格?即使不进行任何分析,您也可以这样做,因为您知道属于一列的所有单元格都具有相同的模式。@f00bar将有其他具有不可预测的列标题和列顺序的表。日期模式是否始终相同?@f00bar是的,它始终相同。我将针对
text()
not
html()进行测试
,在筛选函数内出于某种原因,当我测试此功能时,$.unique不会删除重复值。也许是因为它看到了一个包含所有重复值的唯一jQuery对象?但是,我只需要检查第一行的模式匹配,因为同一列中的所有其他单元格都保证匹配该模式。我可以根据你的想法调整你给我的。是的——忘记$。unique调用,它只适用于DOM元素数组。在我正在试验的JSFIDLE中似乎可以正常工作,但这一定是偶然的。出于某种原因,我将针对单元格的
text()
而不是
html()
进行测试,在测试时,$unique不会删除重复值。也许是因为它看到了一个包含所有重复值的唯一jQuery对象?但是,我只需要检查第一行的模式匹配,因为同一列中的所有其他单元格都保证匹配该模式。我可以根据你的想法调整你给我的。是的——忘记$。unique调用,它只适用于DOM元素数组。在我进行实验的JSFIDLE中似乎工作正常,但这一定是偶然的。