我有一个变量,该变量由多个句子组成,并用名为var a
的点分隔。然后我要检查Result
的值是否等于var a
上的句子之一:
代码如下:
var a = "my name is jack. your name is sara. her name is joe. his name is mike";
var nameSplit = a.split(".");
console.log(nameSplit.length);
console.log(nameSplit);
var Result = "his name is mike";
var i;
for (i = 0; i < nameSplit.length; i++) {
if (nameSplit[i].includes(Result)) {
console.log("Result is one of the sentences on var a");
}
}
代码工作正常。
问题是我不知道如果我在var a
上有1000个句子或10000个句子时,此代码是否快速有效?
是否有任何修改可使代码执行起来更快?
有更好的解决方案吗?
答案 0 :(得分:2)
您可以使用Array.prototype.includes检查数组是否包含字符串。或String.prototype.includes匹配子字符串。
var a = "my name is jack. your name is sara. her name is joe. his name is mike";
var nameSplit = a.split(". ");
var Result = "his name is mike";
nameSplit.includes(Result) // true
或
var a = "my name is jack. your name is sara. her name is joe. his name is mike";
var Result = "his name is mike";
a.includes(Result) // true
答案 1 :(得分:2)
您需要问自己自己要在一个子字符串中找到多少个子字符串(如果只有一个),则不需要拆分,因为拆分本身需要花费时间和空间。 (如果有兴趣,您可以进一步检查KMP算法,该算法可以有效地匹配字符串S中的单词W。)
如果要匹配的子字符串数量很多,则可以使用split,这会花费更多空间来权衡时间。
答案 2 :(得分:1)
我认为最快的方法应该是
str.indexOf('his name is mike') !== -1
但是对于1000个单词,我认为它不相关
答案 3 :(得分:1)
您的问题是您“想检查Result值是否等于句子之一”,但是您的代码不检查是否相等。它允许部分匹配-例如,如果Result
是i
,则它匹配i
中的my name is jack.
。
如果要匹配整个句子,可以将句子拆分为Set
,然后检查匹配是否是恒定时间操作。但是它们需要精确匹配,包括空格。
var a = "my name is jack. your name is sara. her name is joe. his name is mike";
var nameSplit = new Set(a.split(/\.\s+/g))
var Result = "his name is mike";
if (nameSplit.has(Result)) {
console.log("Result is one of the sentences on var a");
}
Result = "his name is";
if (nameSplit.has(Result)) {
console.log("Result is one of the sentences on var a");
} else {
console.log("not in sentences")
}