2014-11-14 9 views
10

Chciałbym wiedzieć, dlaczego lodash nie sortuje tablicy dat w formacie ciągu znaków w porównaniu do zwykłego javascript sort(). Czy oczekuje się zachowania lub błędu?Lo-Dash sortBy tablica dat w formacie smyczkowym

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] 

Zastosowana wersja: Lo-Dash v2.4.1 - Nowoczesna konstrukcja.

Odpowiedz

20

Jeśli zajrzysz do kodu, możesz zobaczyć, w jaki sposób został zaimplementowany. Funkcja _.sortBy wewnątrz używa natywnego Array.prototype.sort (patrz source). Ale korzenia tam nie ma. Bardziej interesująca jest funkcja compareAscending, która jest przekazywana jako wywołanie zwrotne do natywnego sort (source). Tak w kilku słowach swoje

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

przekształca się:

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

więc dlaczego null s są na początku? Ponieważ new Date(null) zwraca Thu Jan 01 1970 01:00:00, która jest mniejsza niż jakakolwiek inna data w twojej tablicy.

Co z native sort? Według specyfikacji (patrz here) Domyślna kolejność sortowania jest zgodna z ciągami znaków kodu Unicode. Jeśli po prostu - natywny sort konwertuje elementy do ciągów i porównuje łańcuchy. Więc rodzimy sortowania jest smth jak:

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

Jak tylko „null” ciąg jest zawsze „większy” niż data ciąg (jak „2014-11-11”) - null s będzie w ogonie wyniku szyk.

+1

Możesz także użyć '_.sortBy (array, String)', który wykorzystuje fakt, że 'String', jako funkcja, również wymusza na String określoną wartość, tak jak' + '' '. – yerforkferchips