2017-08-21 8 views
2

で特定の文字列を含むすべての行を削除するには、しばらくの間、これをうまくしようとして:のDataTableのテーブルをループし、特定の列

私のDataTableのインデックス6の下の列の

、私はクロアチア語にブール値を持っています - 私は、次の手順の後、しかし、インデックス6の下の欄に「DA」を含むすべての行を削除します手順を発射したいもの時点で0の1とNEのための> DA:

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 { 

     } 
    }); 
} 

I削除された行(おそらく最初に検出された行)を1つだけ取得し、コンソールで次の行を取得します。

Uncaught TypeError: Cannot read property '6' of undefined 

また、tableSelectedProducts.row(rowIdx).remove()を切り替えてみました。draw(false); with this.remove()。draw(false);検出した最初の行だけを削除することは絶対に同じエラーです。

バックグラウンドでは何が起こっており、これを解決するにはどうすればよいですか?それは私には、1つの行を削除した後、データテーブルからすべてのデータが存在しない(インデックス6の下の列は未定義です)、私が検出した各行に対してconsole.log(これ)を試みたときに、最初に検出された行が削除された後に出力が出ますが、上記のエラーが発生します。

答えて

4

ループ内のインデックスで配列項目を削除することは悪い習慣です。 1つのアイテムを削除すると、すべてのインデックスが変更されている可能性があります。削除する行のリスト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/

+1

シンプルで素晴らしいです! 1つの行が削除されると、インデックスが変更されるとは決して考えませんでした。ありがとう、あなたは天才です。 –

+0

このメソッドを実装しようとすると、rowIdx、tableLoop、およびrowLoopはすべて定義されていません。 – paparush

+0

@paparush、コードなしで伝えます。しかし、「every」は1.10.6で初めて導入され、以来進化してきたことに注意してください。古いバージョンを使用している可能性があります。 – davidkonrad