Javascript 比较两个字符串数组的最快/最有效的方法
您好,我想知道是否有人可以提供一些建议,以最快/最有效的方式在javascript中压缩两个字符串数组 我正在开发一种基于用户输入的标签云类型的东西——以书面文本的形式输入,比如博客文章之类 因此,我有一个数组,我保留的单词不包括-is,a,the等 目前,我正在做以下工作: 从输入字符串中删除所有标点符号,将其标记化,将每个单词与排除数组进行比较,然后删除所有重复的字符 通过对输入文本中的每个单词在排除数组中的每个项目上循环来进行比较——这似乎是一种蛮力,并且正在使internet explorer在超过几百个单词的数组上崩溃 我还应该提到我的排除列表有大约300个项目 任何帮助都将不胜感激Javascript 比较两个字符串数组的最快/最有效的方法,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,您好,我想知道是否有人可以提供一些建议,以最快/最有效的方式在javascript中压缩两个字符串数组 我正在开发一种基于用户输入的标签云类型的东西——以书面文本的形式输入,比如博客文章之类 因此,我有一个数组,我保留的单词不包括-is,a,the等 目前,我正在做以下工作: 从输入字符串中删除所有标点符号,将其标记化,将每个单词与排除数组进行比较,然后删除所有重复的字符 通过对输入文本中的每个单词在排除数组中的每个项目上循环来进行比较——这似乎是一种蛮力,并且正在使internet explo
谢谢您可以对字符串使用哈希函数(我不知道JS是否有哈希函数,但我相信Google叔叔可以帮助您;])。然后计算排除列表中所有单词的哈希值,并创建一个由这些哈希值索引的数组af布尔值。然后迭代文本并对照该数组检查单词散列。我不确定整个方法,但与其构建一个巨大的数组,然后迭代它,为什么不将“键”放入一个map—“like”对象以便于比较 e、 g 然后当你想比较。。。照办
var wordsToTest = ['these','are','all','my','words','to','check','for'];
var checkWord;
for(var i=0;i<wordsToTest.length;i++){
checkWord = wordsToTest[i];
if(excludes[checkword]){
//bad word, ignore...
} else {
//good word... do something with it
}
}
var wordsToTest=['this'、'are'、'all'、'my'、'words'、'to'、'check'、'for'];
var校验字;
对于(var i=0;i值得尝试将这些单词组合成一个正则表达式,然后与之进行比较。正则表达式引擎的优化可能会使搜索向前跳过搜索文本,这比在单独的字符串上迭代要高效得多。我接受了scunliffe的答案,并将其修改为低点:
var excludes = ['bad','words','exclude','all','these']; //array
现在让我们创建一个函数原型,用于检查值是否在数组中:
Array.prototype.hasValue= function(value) {
for (var i=0; i<this.length; i++)
if (this[i] === value) return true;
return false;
}
我会选择正则表达式版本
text = 'This is a text that contains the words to delete. It has some <b>HTML</b> code in it, and punctuation!';
deleteWords = ['is', 'a', 'that', 'the', 'to', 'this', 'it', 'in', 'and', 'has'];
// clear punctuation and HTML code
onlyWordsReg = /\<[^>]*\>|\W/g;
onlyWordsText = text.replace(onlyWordsReg, ' ');
reg = new RegExp('\\b' + deleteWords.join('\\b|\\b') + '\\b', 'ig');
cleanText = onlyWordsText .replace(reg, '');
// tokenize after this
text='这是一个包含要删除的单词的文本。其中包含一些HTML代码和标点符号!';
deleteWords=['is','a','that','to','this','it','in','has'];
//清除标点符号和HTML代码
onlyWordsReg=/\]*\>\W/g;
onlyWordsText=text.replace(onlyWordsReg',);
reg=newregexp('\\b'+deleteWords.join('\\b |\\b')+'\\b','ig');
cleanText=仅用于ORDSTEXT.replace(reg.);
//在此之后标记化
谢谢你的回复,我会仔细研究一下,但这能快多少,因为你仍然在本质上迭代相同数量的元素,相同的次数,不是吗?不是。你提出的算法有O(nmk)复杂度,其中n是排除列表大小,m-文本大小,k是字符串比较中的平均操作数。我建议的方法对于初始哈希具有O(n)复杂度,对于每个比较具有O(m)复杂度,以防止由于对象的扩展而出现错误。原型
(例如,如果库将each
方法添加到Object.prototype
,“each”将被视为示例代码中的一个坏词),则可以使用jshashtable()。这是有道理的。我已经实现了它,ti在firefox中运行得非常好,但它仍然像以前一样使ie崩溃。我想知道ie是否因类似问题而闻名,或者我的代码是否可以改进。编辑:我刚刚在chrome、opera、firefox和safari中测试了我的代码,它运行得非常快。在ie中,它失败得很惨,我必须重新启动浏览r:(@Tim Down:这是一个很好的理由,在默认名称空间无法识别之前,不要使用将其混合在一起的框架。@David-你有一个url,我们可以在其中看到整个过程吗?可能还有其他东西让IE绊倒了。
var wordsToTest = ['these','are','all','my','words','to','check','for'];
var checkWord;
for(var i=0; i< wordsToTest.length; i++){
checkWord = wordsToTest[i];
if( excludes.hasValue(checkWord) ){
//is bad word
} else {
//is good word
console.log( checkWord );
}
}
['are','my','to','check','for']
text = 'This is a text that contains the words to delete. It has some <b>HTML</b> code in it, and punctuation!';
deleteWords = ['is', 'a', 'that', 'the', 'to', 'this', 'it', 'in', 'and', 'has'];
// clear punctuation and HTML code
onlyWordsReg = /\<[^>]*\>|\W/g;
onlyWordsText = text.replace(onlyWordsReg, ' ');
reg = new RegExp('\\b' + deleteWords.join('\\b|\\b') + '\\b', 'ig');
cleanText = onlyWordsText .replace(reg, '');
// tokenize after this