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

9
希望我能够帮忙。在我的项目中,我有一个空数组,在按下某些按钮时(使用push()),它会填充。我想知道当一组特定元素在数组中时。
在下面的代码中,似乎它可以工作,3个元素都在数组中,所以它打印出“yes”。如果我删除最后一个元素(“TR”),它就会打印“nope”。但是,如果我删除前两个元素中的任何一个,它就会打印“yes”。它似乎只关注includes()函数中的最后一个元素。
是否有任何方式可以让include()或类似的东西检查所有元素是否都在我的数组中?请记住,数组可能有更多元素,并且它们不会被排序。
提前致谢。
var arr = ["TL", "TM", "TR"];

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

将包含参数中的项目抛入数组["TL", "TM", "TR"],并检查它是否是arr的子集。 - Brian
将所有字符串放入一个数组中,然后使用 Array.prototype.every() 来测试该函数是否对数组中的所有项都返回 true。 - Barmar
3个回答

10

问题在于你的if语句,因为includes()基于字符串参数返回一个布尔值。更好的方法是使用类似于以下代码:

问题出现在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");
}

这将是一个很好的函数案例,因为在写入三次包含时存在大量重复。 - jeanpier_re
谢谢您。我已经使用了您上面建议的方法,但将其拆分为函数。我不再有任何问题,感谢您的帮助。 - JordiLaForge

3
虽然上面的答案展示了获取您所需结果的方法,但我很惊讶没有人解释为什么您原始尝试不起作用。这涉及JavaScript遵循的一些基本规则:函数如何调用,逻辑运算符评估和运算符优先级。
调用arr.includes()
首先,您有一个接受单个字符串参数的函数“includes”。您已经给出了一个表达式而不是字符串作为参数,因此它将评估该表达式。如果评估产生一个字符串,它将返回该值。如果它产生不同类型的结果,它将尝试将结果转换为字符串。因此,要澄清一下,您没有给它3个要查找的字符串,而是一个表达式,该表达式将被评估并成为您要查找的字符串。
逻辑运算符评估

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

MDN描述了这种逻辑得很好。给定expr1 && expr2,以下是逻辑:

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

运算优先级

最后,关于运算优先级的说明。逻辑AND && 与自身的优先级相等,因此表达式将从左到右读取。例如,如果您的表达式是"TL" || "TM" && "TR",那么"TM" && "TR"表达式将首先进行计算,因为逻辑AND && 的优先级高于逻辑OR ||

评估您的表达式

了解所有这些,我们可以分析出您的表达式正在做什么:

""TL" && "TM" && "TR"由所有逻辑AND运算符组成,因此我们将从左到右阅读,从"TL" && "TM"开始。由于"TL"是一个真实的字符串,表达式的另一侧被返回,即"TM"。然后是下一个表达式"TM" && "TR",其中"TM"是一个真实的值,所以返回"TR"。最后,includes函数检查"TR"的值是否存在于数组中,并最终返回true。

再次强调,请在其他答案中标记一个作为答案。循环遍历要在数组中搜索的值是您要寻找的内容,编写自己的循环或使用reduce就可以实现,但我想解释一下为什么您的初始尝试可能看起来很奇怪,并澄清正在发生的事情。

"

非常感谢您详细的回复,给了我很好的启示。现在我对发生的事情更加清楚了。再次感谢您。 - JordiLaForge

2

使用数组的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");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接