2

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 にする必要があると思います。

4

1 に答える 1

2
if (match.length = 3) {

あなたはこれを意味しましたか?

if (match.length == 3) {

さらに役立つように、1 つの定数と変数で条件を記述する場合は、代わりに次のように記述できます。

if (3 = match.length) {

これにより、暗黙のうちに常に true を返す割り当てに変換されるのではなく、JavaScript エラーが発生するようになりました。


JavaScript では、 ですので、数字と演算子12 + '4' == '124'には注意が必要です。+PHP などの言語では、文字列連結用の演算子があるため、この問題はありません ;-)

var myRegexp = /([\d]+) ([\w]+)(?: ([\d]+) ([\w]+))?/;
var match = myRegexp.exec(s);
var order = [];

if (typeof match[3] == 'undefined') {
    if (match[2][0] == "m") {
        order.push(parseInt(match[1]));
    }
    // year
    if (match[2][0] == "y") {
        order.push(parseInt(match[1])*12);
    }
    // both elements
} else {
    order.push(parseInt(match[1])*12 + parseInt(match[3]));
}
s = order;
return s;

ところでparseInt(x, 10)、フィールドの先頭にゼロがあると予想される場合に使用します (それ以外の場合0は返されます)。ありがとうファジー

于 2012-06-14T03:02:38.167 に答える