Jquery TableSorter を使用し<td>
て、「'#' year(s) * '#' month(s)」を含む経過時間を並べ替えるカスタム パーサーを作成しています。機能を使うと
$('.techtable td:nth-child(6)').each(function(){
// console.log($(this));
var that = $(this).text();
var myRegexp = /([\d]+) ([\w]+)(?: ([\d]+) ([\w]+))?/;
var match = myRegexp.exec($(this).text());
console.log(match);
});
コマンド ラインから、各インデックスには次のような長さ 5 の配列が含まれます。
["7 months", "7", "months", undefined, undefined]
これに:
["3 years 3 months", "3", "years", "3", "months"]
経過時間に月または年の要素だけがあるかどうかに応じて、次に他の要素があります。テキストを解析するには、正規表現を使用して各要素を収集し、次に JS を使用して複数の要素があるかどうか、1 つの要素のみの場合は「y」または「m」で始まるかどうかをテストし、数値を返します。パーサーは<td>
s を整数形式の月数で ソートできます。
パーサーは、各要素をパラメーター「s」として関数に渡します。「s」で正規表現を直接試すと、長さ5の配列が返されず、3に切り捨てられます(インデックス3がtypeof 'undefined'の場合に切り捨てる行を実行しているかどうかに関係なく)。コンソールを使用してこの関数を直接使用する場合:
$('.techtable td:nth-child(6)').each(function(){
// console.log($(this));
var that = $(this).text();
var myRegexp = /([\d]+) ([\w]+)(?: ([\d]+) ([\w]+))?/;
var match = myRegexp.exec($(this).text());
if (typeof match[3] == 'undefined') {match.length = 3;};
console.log(match);
});
正規表現は配列を適切に返します。要素が 1 つしかない場合 (年または月)、配列は切り捨てられます。カスタム パーサーのコードは次のとおりです。
var myRegexp = /([\d]+) ([\w]+)(?: ([\d]+) ([\w]+))?/;
var match = myRegexp.exec(s);
var order = [];
console.log(match);
if (typeof match[3] == 'undefined') {match.length = 3;};
// 1 element case:
// month
if (match.length = 3) {
if (match[2][0] == "m") {
order.push(match[1]);
}
// year
if (match[2][0] == "y") {
order.push(match[1]*12);
}
// both elements
} else {
order.push(match[1]*12 + match[3]);
}
s = order;
return s;
},
フィドルはこちらです。Elapsed パーサーは、JS パネルの下から 2 番目にあります。ご覧のとおり、配列 (インデックス 4 と 5) から月を取得できないため、月を計算できません。したがって、並べ替えには年のみが組み込まれ、月は元の HTML 配置によって並べ替えられます。私は何が欠けていますか?(私は学んでいます....だから方向性は修正よりも高く評価されますが、私はそれを断りません。)
はい、JSフィドルがロードされていることを認識しています(最初の部分はTableSorterで、検証用の機能を維持します(ヘッダーをクリックしてソートします)が、集中する必要があるのはコードの最後の部分だけです(「//テーブルソーターdateSorterを参照してください) ' 正しいパーサーがどのように見えるかを確認します). セクション '//テーブル ソーター 経過ソーター' は、私の 2 つの試行が行われる場所です。最初の部分はコンソールで使用する作業コードであり、2 番目の部分はパーサーです。どういうわけか、配列の最後の 2 つのインデックスを削除するため、計算する月の情報が失われます。
これでほぼ丸一日を無駄にしてしまったので、Regex を追加し、個人的な評価を 1 にする必要があると思います。