这很难解释所以我只是举个例子。 我有一系列特定的关键字,如下:
const keywordArr = ['jim', 'john'];
然后我有一个字符串:
const message = 'Hello john, how are you doing today?'
我想检查message
是否包含来自keywordArr
的值。我知道我可以循环遍历keywordArr
中的每个值并检查如下:
keywordArr.forEach(function(word) {
if (message.toLowerCase().includes(word)) {
rest of code here..
}
}
但是,我每秒钟会收到大约5条消息,因此该方法会非常耗费性能。有没有有效的方法来做到这一点?
答案 0 :(得分:2)
答案 1 :(得分:1)
使用RegExp.test()
(regex101示例)检查数组是否包含任何单词。
const keywordArr = ['jim', 'john'];
const message = 'Hello john, how are you doing today?'
const pattern = new RegExp(`\\b${keywordArr.join('|')}\\b`, 'gi');
const contains = pattern.test(message);
console.log(contains);

答案 2 :(得分:1)
我们可以使用reduce
和includes
执行此操作,如果您没有进入整个RegExp
的事情:
const keywordArr = ['jim', 'john'];
const message = 'Hello john, how are you doing today?'
let has = keywordArr.reduce((r,v) => message.toLowerCase().includes(v.toLowerCase()) || r, false)
console.log(has)

这将与不区分大小写匹配。如果您想要区分大小写的匹配,请删除这两种toLowerCaser()
方法。
我们可以通过添加&& v
来修改reduce函数,true/false
将返回值而不是false
值。我们还会将起始值从const keywordArr = ['jim', 'john'];
const message = 'Hello john, how are you doing today?'
let name = keywordArr.reduce((r,v) => message.toLowerCase().includes(v.toLowerCase()) && v || r, '')
console.log(name)
修改为空字符串。
&& v

如果我们想要返回字符串中所有名称的列表,我们可以用&& r.concat(v)
替换const keywordArr = ['jim', 'john', 'paul'];
const message = 'Hello john, how are you doing today? -- jim'
let names = keywordArr.reduce((r,v) => message.toLowerCase().includes(v.toLowerCase()) && r.concat(v) || r, [])
console.log(names)
,然后将空字符串中的起始值替换为空数组。
<p class="descriptive-class">
<a ng-href="" onclick="window.open('https://stackoverflow.com', '_system', 'location=yes')">
<img src="assets/img/awesome_picture.png" alt="blablabla">
</a>
</p>
&#13;