您好,我想知道是否有人可以提供一些建议,以最快/最有效的方式在javascript中压缩两个字符串数组。
我正在开发一种基于用户输入的标签云类型的东西 - 输入的形式是书面文本,如博客文章或类似。
因此,我有一个数组,我保留的话不包括 - 是,a,等等。
目前我正在做以下事情:
从输入字符串中删除所有标点符号,对其进行标记,将每个单词与排除数组进行比较,然后删除所有重复项。
比较是通过循环输入文本中每个单词的exclude数组中的每个项目来实现的 - 这似乎是一种蛮力,并且正在使用超过几百个单词的数组上的Internet Explorer崩溃。
我还应该提到我的排除列表有大约300个项目。
真的很感激任何帮助。
由于
答案 0 :(得分:5)
我不确定整个方法,但是不是建立一个巨大的数组然后迭代它,为什么不把“键”放到地图“喜欢”的对象中以便于比较?
e.g。
var excludes = {};//object
//set keys into the "map"
excludes['bad'] = true;
excludes['words'] = true;
excludes['exclude'] = true;
excludes['all'] = true;
excludes['these'] = true;
然后当你想比较时......只需做
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
}
}
允许这些字词通过['are','my','to','check','for']
答案 1 :(得分:2)
值得尝试将单词组合成单个正则表达式,然后与之进行比较。正则表达式引擎的优化可能允许搜索通过在单独的字符串上迭代自己来比搜索文本更有效地跳过搜索文本。
答案 2 :(得分:0)
您可以对字符串使用哈希函数(我不知道JS是否有一个,但我确信谷歌叔叔可以提供帮助;])。然后,您将计算排除列表中所有单词的哈希值,并创建一个由这些哈希值索引的布尔数组。然后只需遍历文本并检查该数组的单词哈希值。
答案 3 :(得分:0)
我已经采取了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;
}
让我们测试一些单词:
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']
答案 4 :(得分:0)
我选择了正则表达式版本
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