javascript - 检查数组是否包含任何另一个字符串数组

时间:2017-05-01 17:47:57

标签: javascript

strings_to_check = ["a", "b", "c"]

test_arrrays = [ [ "a", "c", "e", "g"], [ "v", "x", "y", "z"] ]

检查test_arrays中的每个数组是否包含any数组中strings_to_check个字符串的正确方法是什么 - 即。 a, b or c

我可以做到以下几点,但它的缺点是,即使其中一个字符串存在,它仍会检查其余部分。

for(let i = 0; i < test_arrrays.length; i++){
  for(let j = 0; j < strings_to_check.length; j++){
      if(test_arrrays[i].indexOf(strings_to_check[j]) > -1) {
          console.log("matched");
      }
  }
}

5 个答案:

答案 0 :(得分:1)

假设您要检查test_arrays中的每个数组是否包含strings_to_check数组中的至少一个元素,您可以使用Array#everyArray#some的混合var strings_to_check = ["a", "b", "c"], test_arrrays = [ [ "a", "c", "e", "g"], [ "v", "x", "y", "z"] ], res = test_arrrays.every(v => v.some(c => strings_to_check.indexOf(c) > -1)); console.log(res);函数。

&#13;
&#13;
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:key name="ref-per" match="ProtectionOrderResponse/Person" use="@id"/>

    <xsl:key name="ref-loc" match="PersonLocationAssociation/LocationReference" use="../PersonReference/@ref"/>

    <xsl:template match="ProtectionOrderResponse">
        <xsl:apply-templates select="key('ref-per', 'PRTPER1')"/>
    </xsl:template>

    <xsl:template match="Person">
        <xsl:variable name="ref" select="key('ref-loc', @id)/@ref"/>
        <xsl:value-of select="$ref"/>
    </xsl:template>
</xsl:stylesheet>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

使用更高阶函数可以更简单地完成,而不是使用for循环和大量索引。

  1. 我们希望了解所有test_arrrays元素是否符合某些条件,因此我们知道应该使用every

    test_arrrays.every(/* some criteria */);
    
  2. 现在我们必须找出那个标准。 &#34;包含strings_to_check&#34;中的任何字符串。听起来我们需要在some上使用test_array,以确定strings_to_check中是否包含任何字符串。所以我们的标准&#34;将是:

    test_arrray => test_arrray.some(s => strings_to_check_set.includes(s))
    

    把它放在一起,我们得到:

    test_arrrays.every( test_arrray => 
        test_arrray.some(s => strings_to_check_set.includes(s))
      )
    
  3. includes具有线性时间复杂度,因此我们可以使用Set改进此算法,并将includes替换为has,其具有恒定的时间复杂度。,以获得最终结果:

    strings_to_check = ["a", "b", "c"]
    
    test_arrrays = [ [ "a", "c", "e", "g"], [ "v", "x", "y", "z"] ]
    
    strings_to_check_set = new Set(strings_to_check)
    
    test_arrrays.every(test_arrray =>
        test_arrray.some(s => strings_to_check_set.has(s))
    )
    

答案 2 :(得分:1)

如果您有多个myString.replace('"{{', '{{').replace('}}"', '}}') ,则将test_arrrays转换为strings_to_check以进行常量时间查找是有意义的。总时间复杂度从O(mn)减少到O(m + n log n),其中n是Set中元素的数量,m是所有strings_to_check和O中元素的总数(n log n)是test_arrrays设置时间。

通用Set函数如下所示:

check

答案 3 :(得分:0)

如果您只需要匹配一个字符串,只需添加break,就像这样:

for(/*loop settings*/){
  /*some code*/
  for(/*loop settings*/){
    /*some code*/
    if(/*some conditionnal statement*/){
      /*handling stuff*/
      break;
    }
  }
}

答案 4 :(得分:0)

正如Vivick所说,你必须通过添加assigned_roles.user_id 打破 for循环。
break始终会停止不感兴趣的循环。

所以这就是你必须要做的事情:

break