希望你能帮到忙。我的项目中有一个空数组,当按下某些按钮(使用 push())时,它会填满。我想知道数组中何时有一组特定的元素。
在下面的代码中,它似乎有效,3 个元素都在数组中,因此它打印"是"。如果我取出最后一个元素("TR"),它会打印"nope"。但是,如果我取出前 2 个元素中的任何一个,它会打印"是"。它似乎只关注 include() 函数中的最后一个元素。
有没有办法拥有 include() 或类似的东西,检查是否所有元素都在我的数组中?请记住,数组可能有更多的元素,并且它们不会被排序。
提前谢谢。
var arr = ["TL", "TM", "TR"];
if (arr.includes("TL" && "TM" && "TR")){
console.log("yes");
} else {
console.log("nope");
}
问题出在您的 if 语句中,因为 include() 返回基于字符串参数的布尔值。 更好的方法是使用以下内容:
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");
}
尽管上面的答案显示了获得所需结果的方法,但我很惊讶没有人解决为什么您最初的尝试不起作用。 这就涉及到 JavaScript 遵循的一些基本规则:如何调用函数、逻辑运算符计算和运算符优先级。
调用 arr.include()
首先,你有一个函数includes
它接受单个字符串参数。 您已经为这个参数提供了一个表达式而不是一个字符串,所以它将计算表达式。 如果计算生成字符串,它将返回该值。 如果它生成不同的类型,它将尝试将结果转换为字符串。因此,为了清除它,您没有给它 3 个字符串来查找,而是一个表达式将被计算并成为您要查找的字符串。
逻辑运算符评估
但是该字符串的值是什么?在 JavaScript 中,逻辑运算符的工作方式可以快捷方式并返回正在计算的值之一。 在大多数情况下,我们会比较布尔值,并从评估中得到true
或false
,但我们在这里使用的是字符串,而不是布尔值。 JavaScript 中的字符串可以评估为"truthy"或"falsy",前者是任何有长度的字符串,后者是没有长度的字符串(空字符串)。 考虑到这一点,逻辑 AND&&
运算符的快捷方式功能将查看表达式中的第一个值,如果该值为"falsy",它将返回该值。 如果该值为"真实",它将查看表达式的另一侧并返回其值。
MDN很好地描述了这个逻辑。 给定expr1 && expr2
这是逻辑:
如果可以转换为 false,则返回 expr1;否则,返回 expr2。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && 返回 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
可以实现这一点,但我想解释为什么你最初的尝试可能看起来很奇怪,并弄清楚发生了什么。
这可以使用数组的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");
}