2012-03-02 10 views
10

私は日付属性を持つモデルを束ねたバックボーンコレクションを持っています。私はそれらの日付に基づいてそれらを並べ替えると思います。したがって、最初の日付など。 これを回避する最も良い方法は何ですか?アンダースコアを使用して日付に基づいてコレクションをソートする

日付は、基本日付オブジェクトのように書式設定されています。日{月2012年3月5日午後11時30分00秒GMT-0500(EST)}

おかげ

答えて

36

あなたは数字に変換するgetTimeを使用し、最大限に活用するために、これらの数字を否定することができますので、あなたはDateオブジェクトを持っています-recentの日付が最初に表示されます。あなたのコレクションをソートしておきたい場合は、次のようなコンパレータを使用します。

C = Backbone.Collection.extend({ 
    //... 
    comparator: function(m) { 
     return -m.get('date').getTime(); 
    } 
}); 

トリックを行います。デモ(オープンコンソールしてください):http://jsfiddle.net/ambiguous/htcyh/

バックボーンコレクションもincludeアンダーのsortByので、あなたは、1回の並べ替えを行うことができます:

var sorted = c.sortBy(function(m) { return -m.get('date').getTime() }); 

デモ:http://jsfiddle.net/ambiguous/FF5FP/

またはあなたが取得するtoArrayを使用することができます通常のJavaScript配列で、getTimeを使用しないでsortの標準を使用します。

var sorted = c.toArray().sort(function(a, b) { 
    a = a.get('date'); 
    b = b.get('date'); 
    if(a > b) 
     return -1; 
    if(a < b) 
     return 1; 
    return 0; 
}); 

デモ:http://jsfiddle.net/ambiguous/QRmJ4/

+0

私は非常にクリーンでシンプルなコンパレータ方式が好き。私が持っていた1つの質問は、並べ替えを逆にする方法があることです。だから、日付が現在の日付に近いほど、最初のもので最後のものでないものは次のものを使用しています。コンパイラ:関数(m){ return m.get( 'date')。getTime(); } – Chapsterj

+0

私はちょうど私の日付が日付オブジェクトではなく201203051400の値であることを認識しました。文字列値を扱う方法はありますか?それでも同じ設定を使用するか、最初に値を日付オブジェクトに変換してから比較メソッドを実行する方がよいでしょう。 – Chapsterj

+0

@Chapsterj:Dateオブジェクトを持っている場合は、必要に応じて 'your_date - new Date'または' new Date-your_date'を見ることができます。あなたの日付がISO-8601-ish文字列であれば、それらをコンパレータ関数の日付に変換することができます。データを読み込んで解析すると、日付オブジェクトに変換できます。 –

3

日付情報を持つ文字列を持っている場合することができます....

C = Backbone.Collection.extend({ 
///... 
    comparator: function(m) { 
     return -Date.parse(m.get('datestring')); 
    } 
}); 
関連する問題