【问题标题】:JavaScript - include() - A check to see if multiple elements are in an arrayJavaScript - include() - 检查数组中是否有多个元素
【发布时间】:2017-12-18 19:44:49
【问题描述】:

希望您能提供帮助。我的项目中有一个空数组,它在按下某些按钮时填充(使用 push())。我想知道某组元素何时在数组中。

在下面的代码中,它似乎工作,3 个元素都在数组中,所以它打印“是”。如果我取出最后一个元素(“TR”),它会打印“nope”。但是,如果我取出前两个元素中的任何一个,它都会打印“是”。它似乎只关注 include() 函数中的最后一个元素。

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

提前致谢。

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

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

【问题讨论】:

  • 将包含参数中的项目放入数组 ["TL", "TM", "TR"] 并检查它是否是 arr 的子集。
  • 将所有字符串放入一个数组中,并使用Array.prototype.every() 来测试一个函数是否对数组中的所有项都为真。

标签: javascript arrays include


【解决方案1】:

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

【讨论】:

  • 这对于一个函数来说是一个很好的例子,因为在写作中有很多重复包括三遍。
  • 谢谢。我已经使用了您上面建议的内容,但将其分解为功能。我没有问题了,谢谢你的意见
【解决方案2】:

尽管上述答案显示了获得您想要的结果的方法,但我很惊讶没有人解决您最初的尝试没有奏效的原因。这涉及到 JavaScript 遵循的一些基本规则:如何调用函数、逻辑运算符求值和运算符优先级。

调用 arr.includes()

首先,你有一个函数includes,它接受一个字符串参数。你给这个参数一个表达式而不是一个字符串,所以它会计算这个表达式。如果评估产生一个字符串,它将返回该值。如果它产生不同的类型,它将尝试将结果转换为字符串。 所以为了清楚起见,您并没有给它 3 个要查找的字符串,而是一个将被评估并成为您要查找的字符串的表达式。

逻辑运算符评估

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

MDN 很好地描述了这个逻辑。给定expr1 &amp;&amp; expr2,逻辑如下:

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

顺序优先

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

评估你的表达

了解了所有这些,我们可以分辨出你的表情在做什么:

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

再次,请在此处将其他一个标记为答案。循环遍历要在数组中搜索的值是您要查找的内容,编写自己的循环或使用 reduce 即可完成此操作,但我想解释一下为什么您最初的尝试可能看起来很奇怪并弄清楚了什么正在发生。

【讨论】:

  • 非常有见地,非常感谢您的详细回复。现在发生了什么事情已经清楚多了。再次感谢您
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2018-06-15
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多