DataTables 循环遍历表并删除特定列中包含特定字符串的所有行

Posted

技术标签:

【中文标题】DataTables 循环遍历表并删除特定列中包含特定字符串的所有行【英文标题】:DataTables loop through the table and delete all rows that contain certain string in certain column 【发布时间】:2018-01-29 21:06:23 【问题描述】:

一直在尝试解决这个问题:

在我的 DataTable 的索引 6 下的列中,我有一个关于克罗地亚语的布尔值 -> DA 表示 1,NE 表示 0。有一次,我想启动一个过程,该过程将删除所有包含“DA”的行索引 6 下的列,但是,经过以下过程:

function deleteSelectedDiscountedProducts() 
    tableSelectedProducts.rows().every( function ( rowIdx, tableLoop, rowLoop ) 
        var currentData = this.data();
        if (currentData[6].indexOf("DA") >= 0) 
            tableSelectedProducts.row(rowIdx).remove().draw(false);
         else 

        
     );

我只删除了一行(可能是检测到的第一行)以及控制台中的以下内容:

Uncaught TypeError: Cannot read property '6' of undefined

另外,我尝试切换 tableSelectedProducts.row(rowIdx).remove().draw(false);用 this.remove().draw(false);并且它只删除它检测到的第一行会出现完全相同的错误。

后台发生了什么以及如何解决这个问题?在我看来,删除一行后,数据表中的所有数据都不再存在(索引 6 下的列未定义),当我尝试对检测到的每一行进行 console.log(this) 时,我不删除检测到的第一行后得到任何输出,但上面有错误。

【问题讨论】:

【参考方案1】:

在循环中按索引删除数组项是不好的做法。删除一项后,所有索引都可能已更改。最好选择要删除的行 dom nodes 的列表,然后将其删除。这是一个例子:

$('#delete').on('click', function() 
  var nodes = [];
  table.rows().every(function(rowIdx, tableLoop, rowLoop) 
    if (this.data()[3] == 'Edinburgh') nodes.push(this.node())
  )
  nodes.forEach(function(node) 
    table.row(node).remove().draw()
  )
)

演示 -> http://jsfiddle.net/LqzLzxon/

【讨论】:

简单而精彩!我从没想过一旦删除了一行,索引就会改变。谢谢你,先生,你是个天才。 为什么我尝试实现这个方法时,rowIdx、tableLoop、rowLoop都是UNDEFINED? @paparush,没有代码就无法判断。但请注意,every 最初是在 1.10.6 中引入的,并且从那以后一直在发展。您可能使用的是旧版本。

以上是关于DataTables 循环遍历表并删除特定列中包含特定字符串的所有行的主要内容,如果未能解决你的问题,请参考以下文章

当整个列中包含带有下拉列表的单元格时,如何应用搜索(jQuery DataTables)? [关闭]

循环遍历 DataTables 表以获取所有单元格内容

如何创建一个 SSIS 包,该包循环使用名称中包含特定关键字的 excel 文件?

遍历数据透视表并删除相同的值

SQL遍历表并删除如果不是特定名称

删除 git 历史记录中包含合并的特定提交