让我们考虑以下字符串text
:“我刚刚在汉堡土地上尝试了新汉堡!”以及以下字符串数组[“ eat”,“ burger”,“ fries”]
我想要知道的是text
的单词是否存在于数组中,但是以一种优化的方式...不仅有两个for循环...
有什么想法吗?
答案 0 :(得分:1)
您可以通过加入数组以创建字符串来通过正则表达式来完成此操作。
RegEx参考
通过JavaScript创建RegEx字符串后,它看起来像这样(删除了字符串转义符):
rand(2,4) > 0.4
\b(?:eat|burger|fries)\b
如果需要转义正则表达式,可以通过escaping special characters进行。并映射到需要测试的单词数组上。
const str = 'I just tried the new burgers in burger land!'
const arr = ['eat', 'burger', 'fries']
// "\b" This is a word boundary - Allows you to perform a "whole words only" search
// "(?:xxx)" This is a non-capturing group. It's not stored in memory to be referenced later on.
// 'arr.join()' creates the following string: "eat|burger|fries"
console.log(str.match(new RegExp(`\\b(?:${arr.join('|')})\\b`, 'ig')))
答案 1 :(得分:1)
最优化的IMO方式是将wordsTest
作为对象而不是数组,因此查找变为O(1)
操作。然后您可以使用filter
获取任何匹配值。
const test = "I just tried the new burgers in burger land!";
const wordsTest = {"eat":1, "burger":1, "fries":1}
const wordsInString = (test) => test.split(' ').filter(e => wordsTest[e] )
console.log(wordsInString(test))
console.log(wordsInString('No matching words'))
答案 2 :(得分:0)
使用Array#Filter
和indexOf()
。
Array#Filter
过滤基于数组index
的字符串匹配toLowerCase()
用于区分大小写的字符串
var a ="I just tried the new burgers in burger land!";
var arr = ["eat", "burger", "fries"];
var res = arr.filter(i=> a.toLowerCase().indexOf(i.toLowerCase()) > -1)
console.log(res)