我正在尝试处理非常大的页面的可见文本,例如,整个Orwell's "1984" on this page,但是当我尝试以下操作时,我的Chrome控制台似乎崩溃了。
var script = document.createElement('script');
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(script);
var allWords = $(document.body).children(":visible").text().split(' ');
var uniqueWords = allWords.filter(function(elem, i, array){ return array.indexOf(elem) === i });
以上操作使我的Chrome标签在上次操作时无响应(我停止输入我输入的新命令至少一分钟)。注意:代码段的第一部分只是attaches JQuery to the page。
你会如何尝试像这样处理大字符串,更快?你认为我应该从allWords
中随机抽样,只将过滤函数应用于这个较小的字符串。
答案 0 :(得分:1)
执行最后一行后Chrome标签挂起的原因是算法的复杂性。您可以将每个单词添加到Set
,而不是在每个单词上调用var uniqueWords = new Set();
allWords.forEach(function (word) {
uniqueWords.add(word)
});
Object.keys
如果需要相同代码的ES5版本,可以使用辅助对象作为数据存储。对象键本质上是唯一的,因此您可以使用单词作为键和任何您想要的值来填充空对象,然后使用var uniqueWordsHash = {};
allWords.reduce(function (hash, word) {
hash[word] = null;
return hash;
}, uniqueWordsHash);
var uniqueWordsArray = Object.keys(uniqueWordsHash);
方法
<script>
function getRandomNumber(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
// The variable 'startTime' is synchronized with the server
var startTime=parseInt(<?php echo date("now")?>);
setInterval(function() {
startTime++;
if(startTime%30==0) document.write(parseInt(getRandomNumber(0, 14)).toString()+"<br>");
}, 1000);
</script>