4

いくつかの奇妙な理由で、日付文字列の配列を JavaScript 日付オブジェクトに変換し、それらを並べ替えてから、並べ替えられた日付文字列の配列を返すために私が書いた次の関数は、正しく並べ替えられません。

sortdates: function(dates, separator) {
    var sorteddates = [],
        datestr =[];
    sorteddates = dates.map(function(val) {
        return new Date(val.replace("/"+separator+"/g", " "));
    }).sort();
    for ( i=0; i<sorteddates.length; i++ ) {
        datestr.push((sorteddates[i].getMonth()+1) + "-" + sorteddates[i].getDate() + "-" + sorteddates[i].getFullYear());
    }
    return datestr;
}

日付文字列のテスト配列を作成し、この関数を適用すると:

var testarray = ["2013-8-1", "2013-8-8", "2013-8-15", "2013-8-22", "2013-9-5", "2013-9-12", "2013-8-2", "2013-8-3", "2013-8-4", "2013-8-7", "2013-8-11", "2013-8-14", "2013-8-18", "2013-8-25"];
console.log(sortdates(testarray, "-"));

コンソールに次のログが記録されます。

["8-2-2013", "8-3-2013", "8-4-2013", "8-11-2013", "8-18-2013", "8-25-2013", "8-1-2013", "8-8-2013", "8-15-2013", "8-22-2013", "9-5-2013", "9-12-2013", "8-7-2013", "8-14-2013"]

明らかにソートされていません。

4

2 に答える 2

1

.sort()数値または日付/時刻順ではなく、「辞書」順でソートされます。値が文字列でない場合、デフォルトの文字列変換が行われますが、日付の場合、並べ替えに役立つものは得られません。

ただし、日付を並べ替える方法を知っているカスタムの並べ替えコールバックを提供できます。

.sort(function(a,b) { return a.getTime() - b.getTime(); });

デモ: http://jsfiddle.net/TUAz9/

于 2013-08-04T05:45:20.817 に答える
1

sort()配列内のエントリの文字列表現に基づいて並べ替えます。この場合、Date の文字列表現は のようなものThu Aug 01 2013 00:00:00 GMT-0700 (PDT)になるため、主な並べ替えは曜日によるアルファベット順になります。

Fri Aug 02 2013 00:00:00 GMT-0700 (PDT)
Sat Aug 03 2013 00:00:00 GMT-0700 (PDT)
Sun Aug 04 2013 00:00:00 GMT-0700 (PDT)
Sun Aug 11 2013 00:00:00 GMT-0700 (PDT)
Sun Aug 18 2013 00:00:00 GMT-0700 (PDT)
Sun Aug 25 2013 00:00:00 GMT-0700 (PDT)
Thu Aug 01 2013 00:00:00 GMT-0700 (PDT)
Thu Aug 08 2013 00:00:00 GMT-0700 (PDT)
Thu Aug 15 2013 00:00:00 GMT-0700 (PDT)
Thu Aug 22 2013 00:00:00 GMT-0700 (PDT)
Thu Sep 05 2013 00:00:00 GMT-0700 (PDT)
Thu Sep 12 2013 00:00:00 GMT-0700 (PDT)
Wed Aug 07 2013 00:00:00 GMT-0700 (PDT)
Wed Aug 14 2013 00:00:00 GMT-0700 (PDT)

おそらく、カスタムの並べ替えコールバック関数、または日付のその他の表現を使用して見たいと思うでしょう。おそらく、配列をDateオブジェクトではなくタイムスタンプ値にマッピングすることから始めますか?

return new Date(/* stuff */).getTime();

...関数の後の書式設定コードへの対応する変更と共に。

これをすべてまとめると、次のような関数は期待どおりに機能します。

sortdates: function(dates, separator) {
    return dates.map(function(val) {
        return new Date(val.replace("/"+separator+"/g", " ")).getTime();
    }).sort().map(function(val) {
        var d = new Date(val);
        return (d.getMonth()+1) + "-" + d.getDate() + "-" + d.getFullYear();
    });
}
于 2013-08-04T05:47:46.867 に答える