使用匹配计算带有 Javascript 的字符串中单词的出现次数

yqb*_*qbk 1 javascript regex

我正在尝试使用该match方法计算较长文本中每个单词的出现次数,但不是result我只得到一个错误:

无法读取 null 的属性“长度”

我的函数如下所示:

const myText = "cat dog stop rain cat"

myText.split(" ").forEach((word) => {
  const numberOfOccurrences = myText.match(/word/g).length
  console.log(`${word} - ${numberOfOccurrences}`)
})
Run Code Online (Sandbox Code Playgroud)

我怎样才能修复它以获得正确的结果?

Li3*_*357 6

正则表达式字面上匹配word,因为变量word从未被指示。在字符串中找不到匹配项,myText因此它为空,因此出现错误。像这样尝试:

myText.match(new RegExp(word, "g")).length
Run Code Online (Sandbox Code Playgroud)

这使用RegExp构造函数,它接受两个参数:模式和标志。以上将传递的实际值word而不是文字word和标志g。它相当于/word/gexceptwordword传递的内容正确匹配。请参阅以下代码段:

myText.match(new RegExp(word, "g")).length
Run Code Online (Sandbox Code Playgroud)

正如其他人指出的那样,有更好的方法来做到这一点。上面代码的输出输出了cat两次,因为它出现了两次。我建议将您的计数保存在一个对象中并在每次通过时更新计数,易卜拉欣·马里尔在他们的回答中显示了这一点。这个想法是用来reduce迭代分割数组,并用一个空对象的初始值来减少。然后,用单词的计数加一更新空对象,初始计数为零。