【问题标题】:Check if array includes a value [in an efficient way]检查数组是否包含一个值[以一种有效的方式]
【发布时间】:2019-10-21 02:35:00
【问题描述】:

我有一个由多个句子组成的变量,这些句子用点分隔,名为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 句,我不知道这段代码是否能快速高效地运行?

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

有没有更好的解决方案?

【问题讨论】:

  • 好吧,你可以删除拆分。您最终仍在寻找a.includes(Result) - 拆分与结果无关。除此之外,您仍然需要线性搜索,因此无法改进。
  • 除了不需要拆分之外,您可以查看有关性能的帖子:stackoverflow.com/questions/5296268/…。 Felix kling 很好地介绍了包含其他字符串的字符串的性能更高。
  • 不清楚部分句子是否算作匹配。是否应该匹配:his name is?还是您只想要完整匹配?

标签: javascript


【解决方案1】:

您可以使用 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

【讨论】:

  • 你根本不需要split,因为它也包括字符串工作。
  • 拆分仍然与结果完全无关。你只是在做a.includes(Result) 额外的步骤。
  • 更具体地说,这是因为String.prototype.includes 也是一个东西。
  • 即使result = "his name is mi",最后一种方式也会得到"true"
  • @SaraRee 但使用Result = "his name is mi"a = "my name is jack. your name is sara. her name is joe. his name is mike",使用if (nameSplit[i].includes(Result)) 仍然会得到肯定
【解决方案2】:

我认为最快的方法应该是用

str.indexOf('his name is mike') !== -1

但是对于 1k 字我认为它不相关

【讨论】:

    【解决方案3】:

    您的问题说您“想要检查 Result 值是否等于其中一个句子”,但您的代码不检查是否相等。它允许部分匹配——例如,如果Resulti,它匹配my name is jack. 中的i

    如果要匹配整个句子,可以将句子拆分为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")
    }
      

    【讨论】:

      【解决方案4】:

      您需要问自己要在一个字符串中找到多少个子字符串,如果只有一个,那么您不需要拆分,因为拆分本身需要时间和空间。 (如果有兴趣,可以进一步查看KMP算法,它可以有效匹配字符串S中的单词W。)

      如果要匹配大量子字符串,则可以使用拆分,这会花费更多空间来权衡时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-06
        • 2020-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多