2012-03-02 9 views
10

Ho una collezione di backbone che ha un gruppo di modelli con attributi di data associati a loro. Voglio ordinarli in base alle loro date. Quindi le ultime date prima e così via. Qual è il modo migliore per aggirare questo.Utilizzo di underscore per ordinare una raccolta in base alla data

Le date sono formattate in questo modo, un oggetto data di base. Data {Lun 5 Mar 2012 23:30:00 GMT-0500 (EST)}

Grazie

risposta

36

Hai oggetti Date in modo da poter utilizzare getTime per convertirli in numeri e poi negare quei numeri per ottenere il massimo - Prima le date. Se si desidera mantenere la vostra collezione ordinato poi un confronto come questo:

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

farà il trucco. Demo (aprire la console per favore): http://jsfiddle.net/ambiguous/htcyh/

collezioni Backbone anche include sottolineatura di sortBy in modo che si possa fare una sola volta sorta:

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

Demo: http://jsfiddle.net/ambiguous/FF5FP/

Oppure si potrebbe usare toArray per ottenere un normale array JavaScript e utilizzare lo standard sort senza utilizzare getTime:

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; 
}); 

Demo: http://jsfiddle.net/ambiguous/QRmJ4/

+0

mi piace il metodo di confronto molto pulito e semplice. Una domanda che ho avuto è stata un modo per avere una sorta di inversione. Quindi più la data è vicina alla data corrente, quelli sarebbero i primi e non gli ultimi come si usa il seguente. comparatore: function (m) { return m.get ('date'). getTime(); } – Chapsterj

+0

Ho appena realizzato che le mie date non sono un oggetto data ma un valore di 201203051400, quindi presumo che questo stia causando il problema. Esiste un modo per gestire il valore di stringa e utilizzare ancora la stessa impostazione oppure sarebbe meglio trasformare il valore in un oggetto data e poi eseguire il metodo comparatore. – Chapsterj

+0

@Chapsterj: se si dispone di oggetti Date, è possibile consultare 'your_date - new Date' o' new Date - your_date' come appropriato. Se le tue date sono stringhe ISO-8601-ish, puoi convertirle in Date nella funzione comparatore o tu (meglio IMHO) convertirle in oggetti Date quando carichi e analizzi i tuoi dati. –

3

Se si dispone di stringhe con informazioni aggiornate potete ....

C = Backbone.Collection.extend({ 
///... 
    comparator: function(m) { 
     return -Date.parse(m.get('datestring')); 
    } 
}); 
Problemi correlati