2012-04-19 13 views
5

Ho una matrice di oggetti che hanno una proprietà stringa 'data'. cioè:Ordinamento per data con underscore.js o semplicemente 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' 
    } 
] 

voglio solo convertire le stringhe di data ad una data e ordinarli in base startDate DESC. Qualcuno può dirmi come farlo con il metodo underscore.js _sortBy o anche semplicemente javascript.

Grazie!

risposta

4

forEach e sort dovrebbe gestire questo per voi:

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; controlla la tua console.

15

soluzione una sottolineatura potrebbe essere la seguente:

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

Lei non c'è bisogno di utilizzare le funzioni di nome, naturalmente, ma i nomi fanno la logica un po 'più chiaro.

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

In pianura JavaScript è possibile fare in questo modo:

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

ho fatto in questo modo:

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

Se voglio che scenda, è la stessa cosa ma * -1

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

In questo esempio sto ordinando in base a due campi, è possibile dimenticare item.batchId.

Spero che questo aiuti qualcuno.

Problemi correlati