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



希望你能帮到忙。我的项目中有一个空数组,当按下某些按钮(使用 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 中,逻辑运算符的工作方式可以快捷方式并返回正在计算的值之一。 在大多数情况下,我们会比较布尔值,并从评估中得到truefalse,但我们在这里使用的是字符串,而不是布尔值。 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");
}

最新更新