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 –モダンビルド。
Lodashコードを見ると、それがどのように実装されているかがわかります。内部の関数__.sortBy
_は、ネイティブ_Array.prototype.sort
_を使用します( source を参照)。しかし、根はそこにはありません。より興味深いのは、ネイティブcompareAscending
へのコールバックとして渡される関数sort
( source )です。だから一言で言えば
_.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;
})
_
では、なぜnull
sが最初にあるのでしょうか。 new Date(null)
は_Thu Jan 01 1970 01:00:00
_を返すため、配列内の他のどの日付よりも小さくなります。
ネイティブsort
はどうですか?仕様による( こちら を参照)デフォルトのソート順は、文字列のUnicodeコードポイントに従います。単純な場合-ネイティブsort
は、アイテムを文字列に変換し、文字列を比較します。したがって、ネイティブの並べ替えは次のようなものです。
__.sortBy(array, function(value) {return value + ''; });
_
「null」文字列が常に日付文字列よりも「大きい」とすぐ(「2014-11-11」など)-null
sは結果配列の末尾にあります。