2016-12-09 7 views
0

とIDのグループの最後の要素のカスタムフィルタリングはjqueryの中で、以下のデータテーブルのjQueryのDataTable - 私はデータを持っているチェックボックス

Id  Revision 
----------------- 
123400 | 01 
123401 | 04 
123402 | 09 
456789 | 00 
456790 | 05 
----------------- 

ように見える今、ユーザーがのみ表示するようにデータテーブルをフィルタ]チェックボックスを必要とします最初の4文字でグループ化されたIDのグループのテーブルの最後のエントリ。 これは結果でなければならない上記の表をフィルタリングから

Id  Revision 
----------------- 
123402 | 09 
456790 | 05 
----------------- 

Idsが「1234」と「4567」でグループ化され、最後のエントリが表示されています。

だから、私は、サーバーから取得するすべてのデータをフェッチし、上述した第2のテーブルのデータを含む新しい配列を作成:

var lastIndex; 
    var lastRev; 
    var newData = []; 
    var n = 0; 
    for (var k = 0; k < data.length; k++) 
    { 
     // if new ID is unknown and new Rev is unknown, fill newData and count up 
     if (data[k][0].indexOf(lastIndex) < 0 && data[k][1].indexOf(lastRev) < 0) { 
      newData[n] = data[k]; 
      n++; 
     } 
     else // else overwrite last element 
     { 
      newData[n - 1] = data[k]; 
     } 

     lastIndex = data[k][0].substring(0, 4); 
     lastRev = data[k][1]; 
    } 

予想ように動作していない部分が来ます
$.fn.dataTableExt.afnFiltering.push(function (oSettings, aData, iDataIndex) { 

     var checked = $('#myCheckbox').is(':checked'); 

     if (checked) 
    { 

      for (var i = 0; i < newData.length; i++) 
      {     
       if ((aData[0] == newData[i][0]) && (aData[1] == newData[i][1])) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 

     } 
     else 
     { 
      return true; 
     } 
    } 

var oTable = $('#myTable').dataTable(); 
    $('#myCheckbox').on("click", function (e) { 
     oTable.fnDraw(); 
    }); 

これは、リビジョン "09"のID "123402"である最初の要素のみを返します。 しかし、私はそれが上記の2番目の表に示されているように表示することを期待していました。

何が間違っているのですか、何が不足していますか? すべてのヘルプは、

は、事前にありがとう チャーリーH.

をいただければ幸いです

答えて

1

問題:問題は、ロジックのこの部分です。

 for (var i = 0; i < newData.length; i++) 
     {     
      if ((aData[0] == newData[i][0]) && (aData[1] == newData[i][1])) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

これは最初の反復過ぎて行くことは決してありませんreturn文を持っています。それが1行しか得られない理由です。


ソリューション:あなたはforループでelse一部を削除する必要があります。

 for (var i = 0; i < newData.length; i++) 
     {     
      if ((aData[0] == newData[i][0]) && (aData[1] == newData[i][1])) 
      { 
       return true; // if record found return true immediately; 
      } 
      // if not found wait for next loop, we need to make sure we 
      //complete the loop before deciding the data not found.    
     } 
     return false; // Now since we are out of the loop its obvious that 
         //we didnt find the record. 

この情報がお役に立てば幸いです。..

+0

以下のように私は期待していたように働いたこと、ありがとうございます。この部分を "&&(aData [1] == newData [i] [1])"というループから削除したところで、リビジョンが最後のものと同じときにループが終了してしまいました。 –

関連する問題