2014-11-14 14 views
10

Mi piacerebbe sapere perché lodash non ordina una serie di date in formato stringa rispetto a javascript semplice sort(). È previsto un comportamento o un bug?ordinamento Lo-Dash per data in formato stringa

array = ["2014-11-11", "2014-11-12", null, "2014-11-01", null, null, "2014-11-05"] 

_.sortBy(array); 
// ["2014-11-11", "2014-11-12", null, "2014-11-01", null, null, "2014-11-05"] 

_.sortBy(array, function(value) {return new Date(value);}); 
// [null, null, null, "2014-11-01", "2014-11-05", "2014-11-11", "2014-11-12"] 

array.sort() 
// ["2014-11-01", "2014-11-05", "2014-11-11", "2014-11-12", null, null, null] 

Versione utilizzata: Lo-Dash v2.4.1 - Costruzione moderna.

risposta

20

Se dai un'occhiata al codice di lodash puoi vedere come è implementato. Funzione _.sortBy all'interno utilizza nativo Array.prototype.sort (vedere source). Ma la radice non c'è. Più interessante è la funzione compareAscending passata come callback a nativo sort (source). Quindi, in poche parole il tuo

_.sortBy(array, function(value) {return new Date(value);});

viene convertito in:

array.sort(function(a, b) { 
    var aa = new Date(a), 
     bb = new Date(b); 

    if (aa !== bb) { 
     if (aa > bb) { return 1; } 
     if (aa < bb) { return -1; } 
    } 
    return aa - bb; 
}) 

Allora, perché null s sono in principio? Perché new Date(null) restituisce Thu Jan 01 1970 01:00:00 che è inferiore a qualsiasi altra data nell'array.

E il nativo sort? In base alle specifiche (vedere here) L'ordinamento predefinito è in base ai punti di codice Unicode della stringa. Se semplicemente - nativo sort converte gli elementi in stringhe e confronta le stringhe. Così sorta nativo è smth come:

_.sortBy(array, function(value) {return value + ''; }); 

Non appena 'null' stringa è sempre "più grande" di stringa della data (come '2014/11/11') - null s saranno nella coda del risultato array.

+1

È anche possibile utilizzare '_.sortBy (array, String)', che utilizza il fatto che 'String', come funzione, costringe anche un valore dato a una stringa, proprio come' + '' '. – yerforkferchips