Javascript 将表单元格中的日期模式与jQuery匹配
我有一个HTML表格,其中的单元格包含遵循特定模式的日期。当一个单元格包含日期时,同一列中的所有单元格都是相同模式的日期。如何使用jQuery匹配格式并返回列?下面是一个示例表,演示了该模式:Javascript 将表单元格中的日期模式与jQuery匹配,javascript,jquery,html-table,Javascript,Jquery,Html Table,我有一个HTML表格,其中的单元格包含遵循特定模式的日期。当一个单元格包含日期时,同一列中的所有单元格都是相同模式的日期。如何使用jQuery匹配格式并返回列?下面是一个示例表,演示了该模式: +-------+-----------+-----------------------+-----------------------+----------+ | Type | Compiled? | Modified (CDT) | Created (CDT) | Pr
+-------+-----------+-----------------------+-----------------------+----------+
| 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()
nothtml()进行测试
,在筛选函数内出于某种原因,当我测试此功能时,$.unique不会删除重复值。也许是因为它看到了一个包含所有重复值的唯一jQuery对象?但是,我只需要检查第一行的模式匹配,因为同一列中的所有其他单元格都保证匹配该模式。我可以根据你的想法调整你给我的。是的——忘记$。unique调用,它只适用于DOM元素数组。在我正在试验的JSFIDLE中似乎可以正常工作,但这一定是偶然的。出于某种原因,我将针对单元格的text()
而不是html()
进行测试,在测试时,$unique不会删除重复值。也许是因为它看到了一个包含所有重复值的唯一jQuery对象?但是,我只需要检查第一行的模式匹配,因为同一列中的所有其他单元格都保证匹配该模式。我可以根据你的想法调整你给我的。是的——忘记$。unique调用,它只适用于DOM元素数组。在我进行实验的JSFIDLE中似乎工作正常,但这一定是偶然的。