jQuery DataTable:为何链式调用rows()无法实现多条件筛选?
DataTables链式调用rows()无法叠加筛选条件的原因
你遇到的问题核心在于DataTables的rows()方法每次调用都是基于整个表格的行重新选择,而非在上一次链式调用的结果集上二次筛选。
拿你的代码举例:
table.rows({selected:true}).rows((index, row, node)=>{return row[3]<30}).deselect()
第一次调用rows({selected:true})确实选中了所有已勾选的行,但第二次调用rows(...)时,会直接丢弃之前的结果,重新从整个表格里筛选符合row[3]<30的行,完全忽略了第一个selected:true的条件,这就是第一个条件看似被"忽略"的原因。
正确的链式筛选方式
如果想用链式调用实现"同时满足两个条件"的效果,应该用filter()方法在已选择的结果集上二次过滤,而非再次调用rows():
table.rows({selected:true}).filter((index, row, node)=>{ return row[3]<30; }).deselect();
filter()的作用就是在当前API实例指向的行集合中,进一步筛选符合条件的行,这样就能实现两个条件的叠加。
为什么合并写法有效
你把两个条件合并到同一个rows()方法里的代码:
table.rows((index, row, node)=>{return $(node).hasClass("selected") && row[3]<=30}).deselect()
本质是一次性对整个表格的行做双重条件判断,自然能得到同时满足两个要求的行,这也是合理的实现方式。
补充说明
虽然DataTables.Api支持链式调用,但不同方法的定位不同:rows()、columns()这类是初始选择器方法,用来从完整表格中选取目标集合;而filter()、order()这类是集合操作方法,用来对已有的集合进行二次处理。混淆两者的作用就会出现你遇到的问题。
内容的提问来源于stack exchange,提问作者Hiro
相关产品推荐
相关产品推荐

