JavaScript - include() - 检查多个元素是否在数组中

时间:2017-07-13 20:43:46

标签: javascript arrays include

希望你能提供帮助。我的项目中有一个空数组,当按下某些按钮时会填满(使用push())。我想知道数组中某些元素何时出现。

在下面的代码中,似乎有效,3个元素都在数组中,因此它打印出“是”'。如果我取出最后一个元素(" TR"),它会打印出#no;'。但是,如果我取出前两个元素中的任何一个,它会打印“是”'。它似乎只关注include()函数中的最后一个元素。

有没有办法让include()或类似的东西,检查是否所有元素都在我的数组中?请记住,数组可能包含更多元素,但它们不会被排序。

提前致谢。

var arr = ["TL", "TM", "TR"];

if (arr.includes("TL" && "TM" && "TR")){
    console.log("yes");
} else {
    console.log("nope");
}

3 个答案:

答案 0 :(得分:3)

问题出在你的if语句中,因为includes()根据字符串参数返回一个布尔值。更好的方法是使用类似的东西:

if(arr.includes("TL") && arr.includes("TM") && arr.includes("TR")) {
  console.log("yes");
}

如果阵列中有很多元素,我会建议更多的内容:

var flag = true;
for(i=0; i<arr.length; i++) {
  if(!arr.includes(arr[i])) {
    flag = false;
  }
}
if(flag) {
  console.log("yes");
}

答案 1 :(得分:1)

这可以使用reduce数组方法干净地完成。以下是您的示例:

var arr = ["TL", "TM", "TR"];
var fails = ["TL"] // This will return false
var succeeds = ["TL", "TM", "TR"] // This will return true
var includesAll = (array_to_check) => arr.reduce(
    (accumulator, current) => accumulator && array_to_check.includes(current),
    true
)

if (includesAll(succeeds)){
    console.log("yes");
} else {
    console.log("nope");
}

答案 2 :(得分:1)

尽管上面的答案显示了获得所需结果的方法,但我很惊讶没有人解释为什么你原来的尝试没有成功。这涉及JavaScript遵循的一些基本规则:如何调用函数,逻辑运算符求值和运算符优先级。

调用arr.includes()

首先,你有一个函数includes,它接受​​一个字符串参数。您已将此参数赋予表达式而不是字符串,因此它将评估表达式。如果评估生成一个字符串,它将返回该值。如果它生成不同的类型,它将尝试将结果转换为字符串。 所以为了清理它,你还没有给它3个字符串来寻找,但是一个表达式将被评估并成为你正在寻找的字符串。

逻辑运算符评估

但该字符串的价值是什么?在JavaScript中,逻辑运算符的工作方式可以快捷并返回正在评估的值之一。在大多数情况下,我们要比较布尔值,并从评估中获取truefalse,但我们在此处使用字符串,而不是布尔值。 JavaScript中的字符串可以被评估为&#34; truthy&#34;或&#34; falsy&#34;,前者是任何具有长度的字符串,后者是没有长度的字符串(空字符串)。考虑到这一点,逻辑AND &&运算符的快捷功能将查看表达式中的第一个值,如果该值为&#34; falsy&#34;它将返回该值。如果该值是&#34;真实的&#34;它将查看表达式的另一面并返回其值。

MDN很好地描述了这个逻辑。鉴于expr1 && expr2这里的逻辑是:

  

如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,&amp;&amp;如果两个操作数都为真,则返回true;否则,返回false。

订单优先

最后,关于订单优先顺序的说明。逻辑AND &&与其自身具有相同的优先级,因此您的表达式将从左到右读取。如果您的表达式为"TL" || "TM" && "TR",则会首先评估"TM" && "TR"表达式,因为逻辑AND &&具有比逻辑OR ||更高的优先级。

评估你的表达

了解所有这些,我们可以挑选出你的表达方式:

"TL" && "TM" && "TR"由所有逻辑AND运算符组成,因此我们将从左到右阅读此内容,从"TL" && "TM"开始。因为&#34; TL&#34;是一个真正的字符串,表达式的另一面返回,它是&#34; TM&#34;。接下来的表达式是"TM" && "TR",其中&#34; TM&#34;是一个真正的价值,所以&#34; TR&#34;退回。最后,includes函数正在检查&#34; TR&#34;的值。存在于数组中,最终返回true。

再次,在这里将其中一个标记为答案。循环遍历您要在数组中搜索的值是您正在寻找的,编写您自己的循环或使用reduce完成该操作,但我想解释为什么您的初始尝试可能看起来很奇怪清理正在发生的事情。