2016-09-15 5 views
0

私は、その値に基づいてテーブルを注文する非常に小さくて軽量なカスタム関数を書いています。この機能は、すべての列とスケールでうまく機能します。日付ストリングをyyyy-mm-ddに変換します。

私が持っている問題は、日付順になります。データベースから検索されたデータ(変更できない)は、dd-mm-yyyyの形式です。明らかに、これは01-06-201609-01-2016の前になってはならないので、望ましい結果を得られない最初の値によって順序付けされます。

私はさまざまな日付の変換と比較を行う別々の関数を書くことができましたが、これまでの私の試行錯誤は非常に肥大化しています。ほぼ鼻腔機能より大きくなっています。誰かがこれを行うきれいな方法を提案してもらえますか?

DEMO http://jsfiddle.net/6sskjbod/565/

function sortTable(order, col) { 
    var rows = $('#mytable tbody tr').get(); 

    rows.sort(function(a, b) { 

    var A = $(a).children('td').eq(col).text().toUpperCase(); 
    var B = $(b).children('td').eq(col).text().toUpperCase(); 

    if (order) { 
     if (B < A) return -1; 
     if (B > A) return 1; 
    } else { 
     if (A < B) return -1; 
     if (A > B) return 1; 
    } 

    return 0; 
    }); 

    $.each(rows, function(index, row) { 
    $('#mytable').children('tbody').append(row); 
    }); 
} 
+0

を読み取って値を逆にあなたは 'moment.js'を使用してみましたが?そのような機能を実行するための最良のライブラリの一つです。 –

+1

@NikhilNanjappaありがとうございます。しかし、私は単一のユースケースのためにライブラリを使いたくありません。 –

+0

私はあなたの質問を理解していません。あなたは時系列順にソートする必要がありますか? –

答えて

0

フィドルを可能性が働いた後、関数内で別々に彼らと彼ら自身を扱うれます。それはクラスをチェックすることにより、日付の値だ場合は、この例では、私は単にdetecし、それがyyyy-mm-dd

https://jsfiddle.net/kplcode/2nvopbqo/1/

$(".sort").click(function() { 
    var col = $(this).parent().children().index($(this)); 
    var desc = $(this).hasClass('desc'); 
    var date = $(this).hasClass('date'); 
    sortTable(desc, col, date); 
    $(this).toggleClass("desc asc"); 
}); 

function sortTable(order, col, date) { 
    var rows = $('#mytable tbody tr').get(); 

    rows.sort(function(a, b) { 

    var A = $(a).children('td').eq(col).text().toUpperCase(); 
    var B = $(b).children('td').eq(col).text().toUpperCase(); 

    if(date) { 
     var A = A.split("-").reverse().join('-'); 
     var B = B.split("-").reverse().join('-'); 
    } 

    if (order) { 
     if (B < A) return -1; 
     if (B > A) return 1; 
    } else { 
     if (A < B) return -1; 
     if (A > B) return 1; 
    } 

    return 0; 
    }); 

    $.each(rows, function(index, row) { 
    $('#mytable').children('tbody').append(row); 
    }); 
} 
+0

純粋に比較のために文字列を作成する場合は、日付を数字として扱い、 "" a:a.split( " - ")。reverse()。join( '') 'b 'についても同様にして、単に' a-b'または '(a-b)* -1'を返します。 – RobG

0

はどのようにHTMLに日付を追加していますか?データを受け取っていて、現在の日付の値を知っている場合は、DOM値を追加する前に、

var parts = origDate.split('-'); 
var newFormat = parts[2] + '-' + parts[1] + '-' + parts[0]; 

のように簡単に再フォーマットできます。

+1

簡単に 'origDate.split( ' - ')。reverse()。join( ' - ');' –

2

日付文字列をISO形式(YYYY-MM-DD)に変換するだけで、Dateオブジェクトに変換するだけで済みます。

あなたのjQuery sortTable機能は次のようになります。ここでは

function sortTable(order, col) { 
    var rows = $('#mytable tbody tr').get(); 

    rows.sort(function(a, b) { 
    var A,B; 
if(col==0) 
{ 
     valA = $(a).children('td').eq(col).text().split('-'); 
     valB = $(b).children('td').eq(col).text().split('-'); 
    A = new Date(valA[2]+"-"+valA[1]+"-"+valA[0]); 
    B = new Date(valB[2]+"-"+valB[1]+"-"+valB[0]);; 
} 
else 
{ 
    A = $(a).children('td').eq(col).text().toUpperCase(); 
    B = $(b).children('td').eq(col).text().toUpperCase(); 
    } 
    if (order) { 
     if (B < A) return -1; 
     if (B > A) return 1; 
    } else { 
     if (A < B) return -1; 
     if (A > B) return 1; 
    } 

    return 0; 
    }); 

    $.each(rows, function(index, row) { 
    $('#mytable').children('tbody').append(row); 
    }); 
} 

あなたが広告「日付」クラス固有のthからhttp://jsfiddle.net/7jLvvp0n/2/

+0

もしDateに変換する必要があるなら(それを行う必要はありません)、 'return A - B '。あなたの解は '+ A == + B'のどこであるのかを説明しません。 – RobG

+0

@RobG正確にあなたのポイントを取得していない場合は、詳細を教えてください –

+0

手動で文字列を解析し、別の文字列を作成して、それをDateコンストラクタで解析します(強く推奨されません)。値を日付コンストラクタで直接使用します: 'A =新しいDate(valA [2]、valA [1] -1、valA [0])'。次に、 '-'演算子は日付を時間値に強制するので' return A - B'を実行します( '<'演算子も同様)。しかし、とにかく、 'A = valA [2] + valA [1] + valA [0]'のように日付文字列を連結するだけで、* B *と 'return A - B'と同じことができます。必要な日付はありません。 – RobG

関連する問題