如何从循环中获得匹配的总和?

时间:2017-02-07 18:11:03

标签: javascript

我正在尝试遍历数组以检查数组中的任何单词是否在文本正文中:

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语句来执行操作?

非常感谢任何帮助!

6 个答案:

答案 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/matchCount number of matches of a regex in Javascript

如果您害怕使用正则表达式,或者无法花时间学习它们的工作原理,您可以获得匹配的索引,如果匹配则创建一个子串,不包括该匹配的部分,并在递增计数器时测试它是否再次匹配。如果没有找到匹配项,indexOf()将返回-1。

答案 2 :(得分:1)

您可以使用regExp将文本拆分为单词,然后以这种方式查找所有出现的单词

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:1)

这可能对您有所帮助: 您必须使用.match而不是.indexOf(获取字符串中第一个出现的索引)

&#13;
&#13;
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;
&#13;
&#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})

第二个按空格和标记将字符串拆分为数组。

循环遍历新数组以检查第一张地图中是否存在该单词。

确保在没有案例的情况下比较字符串/单词。

这种方法可以帮助您将运行时效率提高到线性。