Javascript 提高排序性能 var sorted=results.sort(函数(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(新日期(str1)) if(b.date.toLowerCase()!=“”&b.time!=“”) nameB=Date.parse(新日期(str2)) 返回nameA===nameB?0:nameA

Javascript 提高排序性能 var sorted=results.sort(函数(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(新日期(str1)) if(b.date.toLowerCase()!=“”&b.time!=“”) nameB=Date.parse(新日期(str2)) 返回nameA===nameB?0:nameA,javascript,sorting,underscore.js,Javascript,Sorting,Underscore.js,代码中的一个主要瓶颈是在每次排序操作中都要重新计算nameA/nameB。考虑到数组中的每个元素都可能参与多次比较,这是很多不必要的工作。您应该首先使用相同的算法构建排序索引,然后使用它进行排序。您还可以将排序键存储在您排序的同一个对象中,这样您就可以只检查它是否在这里,而不必重新计算它是否在这里 代码中还有两件事是绝对不必要的:.toLowerCase与空字符串进行比较,并在数据时生成无用的数据对象。parse已明确指定为使用字符串 我已经做了两个版本的改进排序-一个带有帮助函数(更漂亮,思想

代码中的一个主要瓶颈是在每次排序操作中都要重新计算nameA/nameB。考虑到数组中的每个元素都可能参与多次比较,这是很多不必要的工作。您应该首先使用相同的算法构建排序索引,然后使用它进行排序。您还可以将排序键存储在您排序的同一个对象中,这样您就可以只检查它是否在这里,而不必重新计算它是否在这里

代码中还有两件事是绝对不必要的:
.toLowerCase
与空字符串进行比较,并在
数据时生成无用的
数据
对象。parse
已明确指定为使用字符串

我已经做了两个版本的改进排序-一个带有帮助函数(更漂亮,思想上更正确)和内联-可能会在一些JS引擎上提供一些额外的加速。它们的运行速度都比您的原始版本快大约3000倍:

(哦,helper函数正好适合你的下划线问题)

与助手:

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;

});
function fill\u datetime\u ms(obj){
如果(obj.date==“”| | obj.time==“”){
return obj.dateTimeMs=“”
}否则{
返回obj.dateTimeMs=Date.parse(obj.Date.toLowerCase()+“”+obj.time)
}
}
var sorted=results.sort(函数(a,b){
var nameA=a.dateTimeMs
var nameB=b.dateTimeMs
如果(!nameA&&nameA!==“”&&nameA!==0){
名称a=填写日期时间ms(a)
}
如果(!nameB&&nameB!==“”&&nameB!==0){
nameB=填写日期时间毫秒(b)
}
返回nameA===nameB?0:nameA
内联:

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(函数(a,b){
var nameA=a.dateTimeMs
var nameB=b.dateTimeMs
如果(!nameA&&nameA!==“”&&nameA!==0){
如果(a.date==“”| | a.time==“”){
nameA=a.dateTimeMs=“”
}否则{
nameA=a.dateTimeMs=Date.parse(a.Date.toLowerCase()+“”+a.time)
}
}
如果(!nameB&&nameB!==“”&&nameB!==0){
如果(b.date==“”| b.time==“”){
nameB=b.dateTimeMs=“”
}否则{
nameB=b.dateTimeMs=Date.parse(b.Date.toLowerCase()+“”+b.time)
}
}
返回nameA===nameB?0:nameA
代码中的一个主要瓶颈是在每次排序操作中重新计算nameA/nameB。考虑到数组中的每个元素都可能参与多次比较,这是很多不必要的工作。您应该首先使用相同的算法构建排序索引,然后使用它进行排序。您还可以将排序键存储在您排序的同一个对象中,这样您就可以只检查它是否在这里,而不必重新计算它是否在这里

代码中还有两件事是绝对不必要的:
.toLowerCase
与空字符串进行比较,并在
数据时生成无用的
数据
对象。parse
已明确指定为使用字符串

我已经做了两个版本的改进排序-一个带有帮助函数(更漂亮,思想上更正确)和内联-可能会在一些JS引擎上提供一些额外的加速。它们的运行速度都比您的原始版本快大约3000倍:

(哦,helper函数正好适合你的下划线问题)

与助手:

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;

});
function fill\u datetime\u ms(obj){
如果(obj.date==“”| | obj.time==“”){
return obj.dateTimeMs=“”
}否则{
返回obj.dateTimeMs=Date.parse(obj.Date.toLowerCase()+“”+obj.time)
}
}
var sorted=results.sort(函数(a,b){
var nameA=a.dateTimeMs
var nameB=b.dateTimeMs
如果(!nameA&&nameA!==“”&&nameA!==0){
名称a=填写日期时间ms(a)
}
如果(!nameB&&nameB!==“”&&nameB!==0){
nameB=填写日期时间毫秒(b)
}
返回nameA===nameB?0:nameA
内联:

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(函数(a,b){
var nameA=a.dateTimeMs
var nameB=b.dateTimeMs
如果(!nameA&&nameA!==“”&&nameA!==0){
如果(a.date==“”| | a.time==“”){
nameA=a.dateTimeMs=“”
}否则{
nameA=a.dateTimeMs=Date.parse(a.Date.toLowerCase()+“”+a.time)
}
}
如果(!nameB&&nameB!==“”&&nameB!==0){
如果(b.date==“”| b.time==“”){
nameB=b.dateTimeMs=“”
}否则{
nameB=b.dateTimeMs=Date.parse(b.Date.toLowerCase()+“”+b.time)
}
}
返回nameA===nameB?0:nameA
最好的办法是让a和b对象从一开始就已经计算出这个值。而不是只循环而不必处理它。或者按照奥列格所说的存储它

最好的办法是让a和b对象从一开始就已经计算了这个值。而不是只循环而不必处理它。或者按照奥列格所说的存储它

如果你不说你想做什么,人们怎么能改进任何事情呢?如果你想要一个通用的代码回顾,我能说的就是:不要像这样使用三元运算符。并注释你的代码(至少解释一下你在做什么)。或者不要指望人们会努力去读它。@bažmegakapa The