コードの主なボトルネックの1つは、すべてのソート操作でnameA/nameBを再計算していることです。配列内の各要素がいくつかの比較に参加する可能性があることを考えると、それは多くの不必要な作業です。最初に同じアルゴリズムを使用してソートインデックスを作成してから、代わりにそれを使用してソートする必要があります。並べ替えるのと同じオブジェクトに並べ替えキーを保存することもできるので、ここにあるかどうかを確認するだけで、ある場合は再計算しません。
コード内の別の2つのことは、絶対に不要です。.toLowerCase
空の文字列との比較と、文字列の操作として明示的に指定されているData
場合の不要なオブジェクトの生成です。Data.parse
私は改良されたソートの2つのバージョンを作成しました-1つはヘルパー関数(よりきれいで、より正確なイデオロギー)とインラインです-いくつかのJSエンジンでいくつかの追加のスピードアップを与えるかもしれません。どちらも元のファイルの約3000倍の速度で実行されます:http://jsperf.com/custom-date-sort。
(ああ、ヘルパー関数はたまたまアンダースコアのsortBy質問に適しています)。
ヘルパー付き:
function fill_datetime_ms(obj){
if (obj.date == "" || obj.time == ""){
return obj.dateTimeMs = ""
} else {
return obj.dateTimeMs = Date.parse(obj.date.toLowerCase() + " " + obj.time)
}
}
var sorted = results.sort(function (a, b) {
var nameA = a.dateTimeMs
var nameB = b.dateTimeMs
if (!nameA && nameA !== "" && !nameA !== 0){
nameA = fill_datetime_ms(a)
}
if (!nameB && nameB !== "" && !nameB !== 0){
nameB = fill_datetime_ms(b)
}
return nameA === nameB ? 0 : nameA < nameB ? -1 : 1;
});
列をなして:
var sorted = results.sort(function (a, b) {
var nameA = a.dateTimeMs
var nameB = b.dateTimeMs
if (!nameA && nameA !== "" && !nameA !== 0){
if (a.date == "" || a.time == ""){
nameA = a.dateTimeMs = ""
} else {
nameA = a.dateTimeMs = Date.parse(a.date.toLowerCase() + " " + a.time)
}
}
if (!nameB && nameB !== "" && !nameB !== 0){
if (b.date == "" || b.time == ""){
nameB = b.dateTimeMs = ""
} else {
nameB = b.dateTimeMs = Date.parse(b.date.toLowerCase() + " " + b.time)
}
}
return nameA === nameB ? 0 : nameA < nameB ? -1 : 1;
});