DataTable多列自定义筛选问题:如何筛选含至少一个“No”的行
解决方案
问题核心在于columns().search('No')的逻辑是要求所有指定列都匹配"No",这和你需要的「至少一列是No」的OR逻辑完全不符。要实现需求,得用DataTable的自定义搜索功能来替代默认的列搜索:
推荐方案:全自定义筛选逻辑
把所有筛选规则整合到一个自定义搜索函数里,避免默认列搜索和自定义筛选的冲突,代码更稳定:
// 先保存原始的全局筛选器(如果有其他自定义筛选的话) var originalGlobalSearches = $.fn.dataTable.ext.search.slice(); // 添加我们的自定义筛选器 $.fn.dataTable.ext.search = $.fn.dataTable.ext.search.concat([ function(settings, data, dataIndex) { var filterOption = $('#CookiesFilter').val(); var rowRawData = table.row(dataIndex).data(); // 获取行的原始JSON数据 switch(filterOption) { case '2': // 要求第2-17列(对应cookie1到cookie16)全部为"Si"(原始值为"1") for (var i = 1; i <= 16; i++) { var cookieField = 'cookie' + i; if (rowRawData[cookieField] !== '1') { return false; // 只要有一列不是1,就排除该行 } } return true; case '3': // 要求第2-17列至少有一个"No"(原始值为"0") for (var i = 1; i <= 16; i++) { var cookieField = 'cookie' + i; if (rowRawData[cookieField] === '0') { return true; // 只要有一列是0,就保留该行 } } return false; // 所有列都是1,排除 default: // 显示全部数据 return true; } } ]); // 下拉选择器的事件只需要触发表格重绘即可 $('#CookiesFilter').on('change', function() { table.draw(); });
为什么用原始数据判断?
因为你列渲染后输出的是带HTML标签的<span class="badge...">No</span>,直接搜索文本容易出错;而原始数据中的cookie1等字段值是"0"对应"No"、"1"对应"Si",用原始值判断更准确可靠。
内容的提问来源于stack exchange,提问作者miguelex
相关产品推荐
相关产品推荐

