1
var sorted = results.sort(function (a, b) {
    var nameA = "";
    var nameB = "";
    var str1 = a.date.toLowerCase() + " " + a.time;
    var str2 = b.date.toLowerCase() + " " + b.time;

    if (a.date.toLowerCase() != "" && a.time!= "") 
     nameA = Date.parse(new Date(str1))

    if (b.date.toLowerCase() != "" && b.time!= "") 
     nameB = Date.parse(new Date(str2))

    return nameA === nameB ? 0 : nameA < nameB ? -1 : 1;

});
  1. 私がソートしている方法に障害がある場合、誰かがコードを改善できますか?より良いアプローチはありますか?
  2. http://underscorejs.org/#sortBy上記の並べ替えを実装するにはどうすればよいですか。
4

2 に答える 2

4

コードの主なボトルネックの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;
});
于 2012-05-25T11:28:43.907 に答える
0

最良の方法は、aオブジェクトとbオブジェクトに最初からこれがすでに計算されていることです。あなたがそれを処理する必要なしにただループするより。または、オレグがそれを保存することについて言っていることに従ってください。

于 2012-05-25T12:02:11.520 に答える