检查数组是否包含值(以一种有效的方式)

时间:2019-06-05 14:48:25

标签: javascript

我有一个变量,该变量由多个句子组成,并用名为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个句子时,此代码是否快速有效?

是否有任何修改可使代码执行起来更快?

有更好的解决方案吗?

4 个答案:

答案 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值是否等于句子之一”,但是您的代码不检查是否相等。它允许部分匹配-例如,如果Resulti,则它匹配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")
}