2012-04-19 12 views
5

Tengo una matriz de objetos que tienen una propiedad de cadena 'fecha'. es decir:Ordenando por fecha con underscore.js o simplemente 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' 
    } 
] 

sólo quiero convertir las cadenas de fecha a una fecha y ordenarlos por startDate DESC. ¿Puede alguien decirme cómo hacer esto con el método underscore.js _sortBy o incluso con javascript?

Gracias!

Respuesta

4

forEach y sort debe manejar eso para usted:

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; revisar tu consola.

15

solución de un guión podría tener este aspecto:

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

Usted no tiene que utilizar funciones con nombre, por supuesto, pero los nombres de hacer que la lógica un poco más claro.

Demostración: http://jsfiddle.net/ambiguous/qe9sZ/

En la llanura JavaScript que podría hacerlo de esta manera:

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

Demostración: http://jsfiddle.net/ambiguous/rPAPG/

0

lo hice de esta manera:

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

Si quiero que descienda, es lo mismo pero * -1

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

En este ejemplo que estoy pidiendo por dos campos, puede olvidarse de la item.batchId.

Espero que esto ayude a alguien.