【发布时间】:2016-02-03 21:02:32
【问题描述】:
我有一个在我的一个页面上运行 onclick 的 js 函数,它使用正则表达式对全局对象数组进行一些文本搜索。
现在每次我运行这个函数时,它开始变得越来越慢 - 第一次是闪电般的速度,第二次需要一秒钟,最后它冻结了 firefox。
这是我的代码的简化版本 -
var search = function(words){
var results = [];
var words = words.toLowerCase();
var searchArr = words.split(' ');
var regexptemplate = '^';
$.each(searchArr,function(){
regexptemplate += "(?=.*\\b" + this + ")";
});
regexptemplate += ".+";
var regex = new RegExp(regexptemplate);
for(var index = 0; index < searchObj.length; index++){// check every model sentence
var curObj = searchObj[index];
var i;
// find the actual sentence
for(i = 1; ((i+1) < 11) && (curObj['level' + (i+1)] != null); i++);
// get sentence in english and german
var text = curObj['level' + i];
var engText = curObj['eng' + i];
if(engText == null){// make sure not to crash the search just because a sentence wasn't formatted right'
engText = "";
}
if ((regex.test(text.toLowerCase()) || regex.test(engText.toLowerCase())) && text.indexOf('{SENTENCE}')!= 0){// check if the word exists in the german or english
// format sentence to not be too long
var displayText = text;
var displayEngText = engText;
$.each(searchArr,function(ind,word){
var resultWord = '';
var engResultWord = '';
if(text.toLowerCase().indexOf(word) != -1){
resultWord = text.substring(text.toLowerCase().indexOf(word),text.toLowerCase().indexOf(word)+word.length);
}
if(engText.toLowerCase().indexOf(word) != -1){
engResultWord = engText.substring(engText.toLowerCase().indexOf(word),engText.toLowerCase().indexOf(word)+word.length);
}
displayText = displayText.replace(resultWord,"<mark>" + resultWord + "</mark>").replace(/\r\n/g,"<br>");
displayEngText = displayEngText.replace(engResultWord,"<mark>" + engResultWord + "</mark>").replace(/\r\n/g,"<br>");
});
// push the sentence to results
if(i == 3){
results.push([displayText,displayEngText,type,curObj['level1'],curObj['level2'],'',text,engText,curObj['eng1'],curObj['eng2'],'',"email" + (index + 1)]);
} else if (i == 2){
results.push([displayText,displayEngText,type,curObj['level1'],'','',text,engText,curObj['eng1'],'','',"email" + (index + 1)]);
} else {
results.push([displayText,displayEngText,type,curObj['level1'],curObj['level2'],curObj['level3'],text,engText,curObj['eng1'],curObj['eng2'],curObj['eng3'],"email" + (index + 1)]);
}
}
}
}
searchObj 是一个全局数组,其中包含大约 1000 个对象。
谁能向我解释为什么这会逐渐变慢?
谢谢
【问题讨论】:
-
同时提供样本数据(格式)
-
你能添加`console.log(searchObj.length);在函数的开头,看看它是否没有增长?第一次调用函数和最后一次调用非常慢之间有什么变化吗?你在搜索相同的词吗?
-
@NurBar,尝试将
searchObj的大小减小到,比如说50。然后比较两种情况的执行时间。然后说出你注意到了什么 -
能否提供一个完整可操作的jsfiddle?
-
你能看到 Chrome 控制台中的 Timeline > Memory 选项卡,看看它是否一直在增长吗?
标签: javascript jquery