web-dev-qa-db-ja.com

文字列形式の日付のローダッシュsortBy配列

Lodashが日付の配列を文字列形式で並べ替えないのは、単純なjavascript sort()と比較してなぜですか。予期された動作またはバグですか?

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]

使用バージョン:Lo-Dash v2.4.1 –モダンビルド。

10
peresleguine

Lodashコードを見ると、それがどのように実装されているかがわかります。内部の関数__.sortBy_は、ネイティブ_Array.prototype.sort_を使用します( source を参照)。しかし、根はそこにはありません。より興味深いのは、ネイティブcompareAscendingへのコールバックとして渡される関数sortsource )です。だから一言で言えば

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

に変換されます:

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

では、なぜnullsが最初にあるのでしょうか。 new Date(null)は_Thu Jan 01 1970 01:00:00_を返すため、配列内の他のどの日付よりも小さくなります。

ネイティブsortはどうですか?仕様による( こちら を参照)デフォルトのソート順は、文字列のUnicodeコードポイントに従います。単純な場合-ネイティブsortは、アイテムを文字列に変換し、文字列を比較します。したがって、ネイティブの並べ替えは次のようなものです。

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

「null」文字列が常に日付文字列よりも「大きい」とすぐ(「2014-11-11」など)-nullsは結果配列の末尾にあります。

22
Kiril