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
代码中的一个主要瓶颈是在每次排序操作中都要重新计算nameA/nameB。考虑到数组中的每个元素都可能参与多次比较,这是很多不必要的工作。您应该首先使用相同的算法构建排序索引,然后使用它进行排序。您还可以将排序键存储在您排序的同一个对象中,这样您就可以只检查它是否在这里,而不必重新计算它是否在这里 代码中还有两件事是绝对不必要的: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已明确指定为使用字符串 我已经做了两个版本的改进排序-一个带有帮助函数(更漂亮,思想
.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