2014-11-14 4 views
10

Ich würde gerne wissen, warum lodash Array von Daten im String-Format im Vergleich zu einfach Javascript sort() nicht sortiert. Ist es erwartetes Verhalten oder ein Fehler?Lo-Dash sortBy Array von Daten im String-Format

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] 

Verwendete Version: Lo-Dash v2.4.1 - Moderner Aufbau.

Antwort

20

Wenn Sie sich den lodash-Code ansehen, können Sie sehen, wie er implementiert wurde. Funktion _.sortBy innen verwendet native Array.prototype.sort (siehe source). Aber die Wurzel ist nicht da. Interessanter ist die Funktion compareAscending, die als ein Rückruf an native sort (source) übergeben wird.

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

Warum null s am Anfang sind: So wird in wenigen Worten Ihre

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

wird konvertiert? Weil new Date(null)Thu Jan 01 1970 01:00:00 zurückgibt, das ist weniger als jedes andere Datum in Ihrem Array.

Was ist mit Native sort? Gemäß Spezifikation (siehe here) Die Standardsortierreihenfolge entspricht den String-Unicode-Codepunkten. Wenn einfach - native sort konvertiert Elemente in Zeichenfolgen und vergleicht Zeichenfolgen. So einheimische Art ist smth wie:

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

Sobald ‚null‘ String ist immer „größer“ als Datumszeichenfolge (wie ‚2014.11.11‘) - null s wird im Heck des Ergebnisses sein Array.

+1

Sie können auch '_.sortBy (array, String)' verwenden, das die Tatsache verwendet, dass 'String' als Funktion auch einen gegebenen Wert für einen String erzwingt, genau wie '+' ''. – yerforkferchips

Verwandte Themen