2012-05-05 16 views
3

jQuery Tablesorterプラグインを使用して、3文字の月と4桁の日付で構成される非常に単純な形式で日付を並べ替える必要があります(例:2010年5月、2011年1月、Mar 2012など)。カスタム日付書式のためのTablesorterプラグイン用のカスタムパーサー

私はそれを行う方法について私の頭を包み込むことができませんでした。私はここに見つかったパーサを適用しようとしました:http://beausmith.com/blog/custom-date-sorting-for-jquery-tablesorter-plugin/。しかし私はreg exと一緒に失われています。助けを容易にするために、私は彼のコードを以下に掲載します。

// TableSort parser for date format: Jan 6, 1978 
$.tablesorter.addParser({ 
id: 'monthDayYear', 
is: function(s) { 
    return false; 
}, 
format: function(s) { 
    var date = s.match(/^(\w{3})[ ](\d{1,2}),[ ](\d{4})$/); 
    var m = monthNames[date[1]]; 
    var d = String(date[2]); 
    if (d.length == 1) {d = "0" + d;} 
    var y = date[3]; 
    return '' + y + m + d; 
}, 
type: 'numeric' 
}); 
var monthNames = {}; 
monthNames["Jan"] = "01"; 
monthNames["Feb"] = "02"; 
monthNames["Mar"] = "03"; 
monthNames["Apr"] = "04"; 
monthNames["May"] = "05"; 
monthNames["Jun"] = "06"; 
monthNames["Jul"] = "07"; 
monthNames["Aug"] = "08"; 
monthNames["Sep"] = "09"; 
monthNames["Oct"] = "10"; 
monthNames["Nov"] = "11"; 
monthNames["Dec"] = "12"; 

月名と年をフォーマットする方法に関するアイデアはありますか?ありがとう!

更新: 私は以下のサムとファッジーの両方からいくつかのコードを実装しようとしました。私はそれを働かせることができません。私はfugeyのコードサンプルを使用しようとしました。なぜなら、それがフィドルのデモで必要に応じて正確に動作している場所を見ているからです。以下は私のHTMLマークアップです:

<table id="myTable" class="stripeMe sample" width="100%" cellpadding="0" cellspacing="0"> 
<thead> 
<th width="30%" align="left">COMPANY</th><th width="35%">DESCRIPTION</th><th width="17%" align="left">INDUSTRY</th><th width="18%" align="left">EXIT DATE</th></tr></thead> 
<tbody> 
<tr><td width="30%"> <a href="http://www.cartera.com/vesdia.html "> Cartera Commerce, Inc.</a> </td> 
<td width="35%">Provides technology-enabled marketing and loyalty solutions 
</td><td width="17%"> Financials </td><td width="18%">Feb 2010</td></tr><tr><td width="30%"> <a href="http://www.criticalinfonet.com/ "> Critical Information Network, LLC</a> </td> 
<td width="35%">Operates library of industrial professional training and certification materials 
</td><td width="17%"> Education </td><td width="18%">Apr 2011</td></tr><tr><td  width="30%"> <a href="http://www.cynergydata.com/ "> Cynergydata</a> </td> 
<td width="35%">Provides merchant payment processing services and related software products 
</td><td width="17%"> Merchant Processing </td><td width="18%">May 2011</td></tr><tr> <td width="30%"> <a href=" "> EVCI Career Colleges Holding Corp</a> </td> 
<td width="35%">Operates post-secondary schools 
</td><td width="17%"> Education </td><td width="18%">Jul 2012</td></tr><tr><td width="30%"> <a href="http://www.groundlink.com/ "> Groundlink, Inc.</a> </td> 
<td width="35%">Provides ground transportation services domestically and internationally 
</td><td width="17%"> Transportation </td><td width="18%">Feb 2012</td></tr><tr><td width="30%"> <a href="http://www.haggen.com/ "> Haggen, Inc.</a> </td> 
<td width="35%">Operates chain of high-end grocery stores in the Pacific Northwest 
</td><td width="17%"> Grocery </td><td width="18%">Aug 2011 </td></tr> 

</tbody> 
</table> 

そしてfudgeyのある私が使用していたスクリプトが、私は(それが私のテーブル内の4番目の列です)3に列ヘッダーの数を変更し、私はtablesorterへの呼び出しを変更テーブルのIDを使用します。この場合は、元の#myTableです。また、私はjQueryの$(ドキュメント).readyに包み:

$(document).ready(function() { 
$.tablesorter.addParser({ 
id: 'monthYear', 
is: function(s) { 
return false; 
}, 
format: function(s) { 
var date = s.match(/^(\w{3})[ ](\d{4})$/); 
var m = date ? date[1] + ' 1 ' || '' : ''; 
var y = date && date[2] ? date[2] || '' : ''; 
return new Date(m + y).getTime() || ''; 
}, 
type: 'Numeric' 
}); 

$('#myTable').tablesorter({ 
headers: { 
    3: { 
     sorter: 'monthYear' 
    } 
} 
}); 
}); 

そして、それはまだ日付でその列のソートされていない、私はそれをソートされたかどうかはわかりません - 私はこの順序でソートを取得し、これは、ほぼ右のようだが、2010年2月には右2011の日付の真ん中に、落ちることをどこを見て - 奇妙な: 2011年8月 2010年2月 2011年4月 2011年5月 2012年2月 2012年7月

+0

誰にでもアイデアはありますか?ありがとう! – seanx

+0

ミリ秒単位で日付を返す必要があり、monthNames配列は必要ありません。 [この質問への私の答えを見る](http://stackoverflow.com/questions/9568473/sort-date-field-with-tablesorter/9572850#9572850)。 –

+0

あなたのコードを追加していただきありがとうございます。あなたのコードを追加していただきありがとうございます。次のようなエラーが発生します:TypeError: 'function parse(){ [ネイティブコード] }'はコンストラクタではありません( 'new Date.parse ) ') – seanx

答えて

1

  1. をフォーマット機能は、空のテーブルセルを処理できるようにする必要があります。

    変更三つのことがあります。

  2. format関数は、文字列または数値を返す必要があります。
  3. パーサーの種類は「数値」または「テキスト」のみです。

私はこのパーサコードとthis demoになりました。

$.tablesorter.addParser({ 
    id: 'monthYear', 
    is: function(s) { 
     return false; 
    }, 
    format: function(s) { 
     // remove extra spacing 
     s = $.trim(s.replace(/\s+/g, ' ')); 
     // process date 
     var date = s.match(/^(\w{3})[ ](\d{4})$/), 
      m = date ? date[1] + ' 1 ' || '' : '', 
      y = date && date[2] ? date[2] || '' : ''; 
     return new Date(m + y).getTime() || ''; 
    }, 
    type: 'Numeric' 
}); 

$('table').tablesorter({ 
    headers: { 
     0: { 
      sorter: 'monthYear' 
     } 
    } 
}); 

更新:余分なスペースを削除する行を追加しました。

+0

私は必要とするフォーマットであり、あなたのデモがどのように完璧に動作しているかを見ていただきありがとうございます。私はそれが私のテーブルで動作するように見えることはできません!おそらく誰かが私が間違っていることに気付くかもしれないように、私は上記のコードを再掲載しています。 – seanx

+0

Ok、update 2:なぜ動作していないのか分かりました。​​タグ内の日付テキストの両側にスペースがあります。私の質問は、パーサでこれを説明する方法はありますか?これらは自動的に挿入されるようですが、私はWordPressとAdvance Custom Fieldプラグインを使用しています。このテーブルはエンドユーザの管理者によって編集されるので、プラグインによってスペースが挿入されている理由も追跡する必要がありますが、その間にスペースをチェックして無視する方法がありますか?正確に一致するように - ありがとう! – seanx

+0

更新3:私はそれが働いている - 私はテンプレートファイルに移動し、余分なスペースがテーブルのセルに挿入されていないことを確認するHTML/PHPマークアップを再フォーマットすることができた。もう1つの質問:このクライアントがコラムを望む方法、「アクティブ」というラベルの付いた会社を含めてグループを興奮させている企業を欲しい - 興奮した企業は、上記の日付でソートしたもの。私は日付の列に「アクティブ」を配置することができます。列の上端または下端のいずれかをソートするとリストに表示されますが、 – seanx

1

よく形成された日付でこれはあなたの答えでなければなりません:

$.tablesorter.addParser({ 
    id: 'monthYear', 
    is: function(s) { 
     return false; 
    }, 
    format: function(s) { 
     var date = s.match(/^(\w{3})[ ](\d{4})$/); 
     var m = date[1]; 
     var y = date[2]; 
     return new Date(m + ' ' + 1 + ' ' + y); 
    }, 
    type: 'date' 
}); 

$(document).ready(function() { 
    $('.tablesorter').tablesorter({ 
     headers: { 
     1: { 
      sorter: 'monthYear' 
     } 
     } 
    }); 
}); 

正規表現を使用して月の省略形と年を抽出し、並べ替えの日付に変換します。私はSamTysonの答え@変更した

+0

あなたはここに投稿したものの一般的な原則を理解していますが、私は次のエラーが出ます:TypeError:' null 'はオブジェクトではありません(' date [1] 'を評価しています) 。なぜどんなアイディアですか?ありがとう! – seanx

+0

偶然、私が元の質問に元のコードを入力して元のコードにしようとすると、同じエラーが発生する – seanx

+0

正規表現が期待するようにデータがフォーマットされていないようです。あなたは日付の列のいくつかを投稿できますか? –