我正在尝试遍历数组以检查数组中的任何单词是否在文本正文中:
for(var i = 0; i < wordArray.length; i++ ) {
if(textBody.indexOf(wordArray[i]) >= 1) {
console.log("One or two words.");
// do something
}
else if (textBody.indexOf(wordArray[i]) >= 3) {
console.log("Three or more words.");
// do something
}
else {
console.log("No words match.");
// do something
}
}
>= 1
和>= 3
应该确定匹配单词的数量(虽然它可能只是确定它们在数组中的索引位置?因为,在它的当前状态下它将是console.log数百个来自if / else语句的重复字符串)。 如何根据匹配单词的数量设置if / else语句来执行操作?
非常感谢任何帮助!
答案 0 :(得分:1)
是.indexOf为您提供字符串中单词的第一个位置。有许多方法可用于计算字符串中的单词,我分享了我的疯狂版本:
function matchesCount(word, str) {
return (' ' + str.replace(/[^A-Za-z]+/gi,' ') + ' ')
.split(' '+word+' ').length - 1;
}
console.log(matchesCount('test', 'A test to test how many test in this'));
答案 1 :(得分:1)
indexOf()提供第一个匹配的索引,而不是匹配的数量。因此,目前您首先测试它是否出现在索引1,然后是索引3 - 不计算匹配数。
我可以想到几个不同的方法可以起作用,但我不打算为你写,因为这听起来像学校的工作。一种方法是使用匹配:请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match和Count number of matches of a regex in Javascript
如果您害怕使用正则表达式,或者无法花时间学习它们的工作原理,您可以获得匹配的索引,如果匹配则创建一个子串,不包括该匹配的部分,并在递增计数器时测试它是否再次匹配。如果没有找到匹配项,indexOf()将返回-1。
答案 2 :(得分:1)
您可以使用regExp将文本拆分为单词,然后以这种方式查找所有出现的单词
var text = "word1, word2, word word word word3"
var allWords = text.split(/\b/);
var getOccurrenceCount = function(word, allWords) {
return allWords.reduce(function(count, nextWord) {
count += word == nextWord ? 1 : 0;
return count;
}, 0);
};
getOccurrenceCount("word", allWords);
&#13;
答案 3 :(得分:1)
这可能对您有所帮助:
您必须使用.match
而不是.indexOf
(获取字符串中第一个出现的索引)
var textBody = document.getElementById('inside').innerHTML;
var wordArray = ['check','test'];
for(var i = 0; i < wordArray.length; i++ ) {
var regex = new RegExp( wordArray[i], 'g' );
var wordCount = (textBody.match(regex) || []).length;
console.log(wordCount + " times the word ["+ wordArray[i] +"]");
}
&#13;
<body>
<p id="inside">
this is your test, check the test, how many test words check
<p>
</body>
&#13;
答案 4 :(得分:1)
试试这个:
for (var i = 0; i < wordArray.length; i++) {
var regex = new RegExp('\\b' + wordArray[i] + '\\b', 'ig');
var matches = textBody.match(regex);
var numberOfMatches = matches ? matches.length : 0;
console.log(wordArray[i] + ' found ' + numberOfMatches + " times");
}
indefOf
会进行部分匹配。例如,"This is a bust".indexOf("bus")
会匹配,即使这可能不是您想要的。最好使用带有边界标记\b
一词的正则表达式来消除部分字匹配。在Regexp构造函数中,您需要转义斜杠,以便\b
变为\\b
。正则表达式使用i
标志来忽略大小写,使用g
标志来查找所有匹配项。使用基于console.log
变量的if / else逻辑替换numberOfMatches
行。
更新:根据您的说明,您可以将上述内容更改为
var numberOfMatches = 0;
for (var i = 0; i < wordArray.length; i++) {
var regex = new RegExp('\\b' + wordArray[i] + '\\b', 'ig');
var matches = textBody.match(regex);
numberOfMatches += matches ? matches.length : 0;
}
console.log(numberOfMatches);
答案 5 :(得分:1)
我首先将数组放入一个hashmap,就像这样 _.each(array,function(a){map [a] = 1})
第二个按空格和标记将字符串拆分为数组。
循环遍历新数组以检查第一张地图中是否存在该单词。
确保在没有案例的情况下比较字符串/单词。
这种方法可以帮助您将运行时效率提高到线性。