2012-04-19 16 views
5

Mam tablicę obiektów, które mają właściwość string "date". tj:Sortowanie według daty za pomocą znaku underscore.js lub po prostu JS

[ 
    { 
     id: 1, 
     startDate: '2011-4-22' 
    }, 
    { 
     id: 2, 
     startDate: '2012-3-15' 
    }, 
    { 
     id: 3, 
     startDate: '2011-4-22' 
    }, 
    { 
     id: 4, 
     startDate: '2012-2-10' 
    } 
] 

po prostu chcę, aby przekonwertować łańcuchach daty do daty i sortować je według startDate DESC. Czy ktoś może mi powiedzieć, jak to zrobić za pomocą metody underscore.js _sortBy lub nawet zwykłego javascript.

Dzięki!

Odpowiedz

4

forEach i sort powinien obsługiwać to dla ciebie:

var data = [ 
    { 
     id: 1, 
     startDate: '2011-4-22' 
    }, 
    { 
     id: 2, 
     startDate: '2012-3-15' 
    }, 
    { 
     id: 3, 
     startDate: '2011-4-22' 
    }, 
    { 
     id: 4, 
     startDate: '2012-2-10' 
    } 
]; 

var i, c; 

for(i = 0; c = data[i]; i++) { 
    var parts = c.startDate.split('-'); 

    c.startDate = new Date(+parts[0], +parts[1] - 1, +parts[2]); 
} 

data.sort(function(a, b) { 
    return b.startDate - a.startDate; 
}); 

Here's a demo; Sprawdź swoją konsolę.

15

rozwiązanie znakiem podkreślenia mógłby wyglądać następująco:

a = [ /* ... */ ]; 

function to_date(o) { 
    var parts = o.startDate.split('-'); 
    o.startDate = new Date(parts[0], parts[1] - 1, parts[2]); 
    return o; 
} 
function desc_start_time(o) { 
    return -o.startDate.getTime(); 
} 
var b = _.chain(a) 
     .map(to_date) 
     .sortBy(desc_start_time) 
     .value(); 

Nie trzeba używać nazwanych funkcje oczywiście ale nazwiska robią logika nieco jaśniejsze.

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

W zwykłym JavaScript można zrobić to tak:

for(var i = 0, parts; i < a.length; ++i) { 
    parts = a[i].startDate.split('-'); 
    a[i].startDate = new Date(parts[0], parts[1] - 1, parts[2]); 
} 
var b = a.sort(function(a, b) { 
    return b.startDate - a.startDate; 
}); 

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

0

zrobiłem to w ten sposób:

var sorted = _(list).sortBy(
        function (item) {       
         return [new Date(item.effectiveDate).getTime(), item.batchId]; 
        }), "batchId"); 

Jeśli chcesz, żeby zszedł, to jest to samo, ale * -1

var sorted = _(list).sortBy(
        function (item) {       
         return [new Date(item.effectiveDate).getTime()*-1, item.batchId]; 
        }), "batchId"); 

W tym przykładzie zamawiam przez dwa pola, można zapomnieć o item.batchId.

Mam nadzieję, że to komuś pomaga.

Powiązane problemy