【问题标题】:Datatables exact word search数据表精确词搜索
【发布时间】:2016-02-04 17:12:31
【问题描述】:

您好,我使用的是datatables,我想用一个确切的词过滤我的数据。

我的表格数据如下所示;

+-----+----------+
| num | status   |
+-----+----------+
| 1   | Active   |
+-----+----------+
| 2   | Inactive |
+-----+----------+
| 3   | Active   |
+-----+----------+

每当我搜索Active 时,我也会看到所有Inactive。有没有办法过滤这个,以便状态列只显示确切的单词。

我的JS在下面;

$(document).ready(function() {
    var table = $('#items').DataTable( {
    select: true,
    responsive: true
    } );
} );

我一直在阅读API,但我无法理解它。也许我需要写一些正则表达式?

有一个例子(我认为)here,但是我需要根据自己的需要对其进行修改。

任何帮助或建议将不胜感激。

【问题讨论】:

  • 如果您使用服务器端脚本制作过滤器,效果会更好。作为建议,activeinactive 状态可以是编号值(0 或 1),并通过它进行过滤,不会有模棱两可的结果。
  • 这是一个关于 0 和 1 的好建议 @MarcosPérezGude 但这是否意味着在表格中也向最终用户显示 0 和 1?理想情况下,我希望他们看到“活跃”和“不活跃”这两个词。它们实际上在我的 MySQL 数据库中存储为 0 和 1。我通过 php 将它们转换为字符串(活动/非活动)并将它们显示在表格中。
  • 你也可以看到这个 -> stackoverflow.com/questions/29783136/…
  • @johnny_s 在数据库中您可以保存为 int 值(0、1、2 等),并使用字符串值(1 = Active,0 = inactive,2 =两者等)。过滤时,您可以显示与 int 值相关的字符串值。如果你可以做这样的事情,数据表将不必呈现数字。我经常使用 jQGrid,它与这样的技术完美配合。

标签: jquery regex datatable


【解决方案1】:

如果您认为您最好使用custom filter 来完成此任务。 unbind 默认处理程序并每次执行完全匹配过滤器。如果你有一张桌子

var table = $('#example').DataTable()  

然后以这种方式使用完全匹配的自定义过滤器

$('.dataTables_filter input').unbind().bind('keyup', function() {
   var searchTerm = this.value.toLowerCase()
   if (!searchTerm) {
      table.draw()
      return
   }
   $.fn.dataTable.ext.search.push(function(settings, data, dataIndex) {
      for (var i=0;i<data.length;i++) {
         if (data[i].toLowerCase() == searchTerm) return true
      }
      return false
   })
   table.draw();   
   $.fn.dataTable.ext.search.pop()
})

这是一个演示 -> http://jsfiddle.net/hmjnqjbs/1/ 尝试搜索tokyo


好的。我意识到问题不在于精确匹配过滤器中的“精确单词”,而更多的是整个单词搜索。当我们搜索vaio 时,我们希望看到Vaio Q900,但我们不想看到VaioQ900,因为Vaio 这里不是一个完整的词。这个问题可以通过使用正则表达式单词边界\b简单地解决:

$('.dataTables_filter input').unbind().bind('keyup', function() {
   var searchTerm = this.value.toLowerCase(),
       regex = '\\b' + searchTerm + '\\b';
   table.rows().search(regex, true, false).draw();
})

更新了下面评论中 OP 的小提琴 -> http://jsfiddle.net/hmjnqjbs/3/

现在activevaio 等按预期工作。

【讨论】:

  • @johnny_s,我的错 :(毕竟昨天可能为时已晚 - 如果searchTerm 为空,过滤器当然应该“重置”(可以通过简单的draw() 完成) - 也更新了答案和小提琴。
  • @johnny_s - 我意识到我可能完全误解了你的问题。您不想要完全匹配 - 您只想搜索整个单词并避免复合词。如果是这样,自定义过滤器不是必需的,请查看更新的答案并更新您的小提琴 -> jsfiddle.net/hmjnqjbs/3
【解决方案2】:

可以通过这种方式过滤具有完全匹配的搜索结果 -

table.column(index).search("^" + searchText + "$", true, false).draw();

更多信息 - https://stackoverflow.com/a/19114759/698127

【讨论】:

    【解决方案3】:

    希望这会有所帮助。在两端添加'\\b' 将使表格只搜索整个单词。

    var regex = '\\b' + searchKey + '\\b';
    <yourDataTable>.columns(<columnIndex>).search( regex, true, false).draw();
    

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 2017-10-21
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多