【问题标题】:Check to see if exactly two out of three booleans are true?检查三个布尔值中的两个是否为真?
【发布时间】:2019-05-22 07:30:27
【问题描述】:

我需要测试三个布尔值中的两个是否为真。

类似这样的:

if ((a && b && !c) || (a && !b && c) || (!a && b && c)) {
  // success
}

这是解决此问题的最直接方法吗?有人知道快捷方式/速记吗?

【问题讨论】:

  • 检查this answer
  • 是的,我看到了一个,但我的问题有所不同,因为这种情况“至少”有两个……这意味着第三个也可能是真的,但在我的情况下不是。跨度>

标签: javascript if-statement boolean


【解决方案1】:

a=true;
b=true;
c=false;
arr = [a,b,c]
result = arr.reduce((acc, cur) => acc+cur) == 2;

console.log(result);

这种方法的优点是:

  • 没有转换为布尔值
  • 易于推广到任意大小/任意数量的真值的数组

对于更长的数组,人们可能会考虑一种性能更好的解决方案,一旦达到所需的数字就停止求和

n=2
// large array
arr=[true,true,true].concat(Array(10000).fill(false))

// reduce will stop as soon as result is >n
result = arr.slice(0).reduce((acc, cur, i, a) => {acc+=cur; if (acc>n) a.splice(1); return acc});
console.log(result==2)

【讨论】:

    【解决方案2】:

    您可以将这些布尔值转换(转换)为整数并将它们相加。然后检查它是否等于2。像这样(C):

    int res = (int)a + (int)b + (int)c;
    if (res == 2) { /* Do something... */ }
    

    编辑:

    对于 JavaScript,您甚至不需要转换值:

    const res = a + b + c
    if (res == 2) { /* Do something... */ }
    

    【讨论】:

    • 你的答案几乎是正确的,但这是 Javascript 而不是 C,所以你的语法是错误的。 :)
    • @Keith 更新了答案
    【解决方案3】:

    在 JavaScript(和大多数其他现代编码语言)中,布尔变量可以存储为二进制整数(10),这些整数可以用作布尔值。看这个例子:

    if (1) {
        console.log("1 is true");
    } else {
        console.log("1 is false");
    }
    
    if (0) {
        console.log("0 is true");
    } else {
        console.log("0 is false");
    }

    所以要检查三个布尔值中的两个,您可以这样做:

    var a = true;
    var b = false;
    var c = true;
    
    var total = (a ? 1 : 0) + (b ? 1 : 0) + (c ? 1 : 0);
    if (total == 2) {
        console.log("Success!");
    }

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      你甚至不需要转换它们。

      let a = true;
      let b = true;
      let c = false;
      
      if(a + b + c === 2) {
          console.log('You won!');
      } else {
          console.log('Not 2');
      }
      

      【讨论】:

      • 嗯,这仍然可以转换它们。 (并不是说我认为这是一个糟糕的解决方案,但显然有些人不喜欢它。)== 没有在这里完成转换,而是 + 将布尔值隐式转换为数字这里。 (一般来说,我认为+ 将另一个参数转换为字符串,如果一个参数已经是字符串,否则它将它们都转换为数字。)
      【解决方案5】:

      我会采用这种可读 (IMO) 的方式:

      let conditions = [a && b && !c, a && !b && c, !a && b && c]
      if(conditions.filter(c => c).length === 2) { /* ... */}
      

      【讨论】:

        【解决方案6】:

        检查两个是否正好等于true

        [a, b, c].filter(Boolean).length === 2;
        

        参考资料:

        【讨论】:

          【解决方案7】:

          如果您想查看是否有三分之二的布尔值多次为真,您可以使用函数来缩短您的代码。

          function boolTest(a, b, c) {
              if ((a && b && !c) || (a && !b && c) || (!a && b && c)) {
                  return true
              } else {
                  return false
              }
          }

          然后,你可以这样使用它:

          boolTest(true, true, false) // returns true
          boolTest(false, true, false) // returns false

          【讨论】:

            【解决方案8】:

            如果添加值,您可以检查结果是否为 2

            if ((a + b + c) == 2) {
                // do something
            }
            

            【讨论】:

            • 谢谢。我忘了考虑布尔值在 JS 中只是 1 和 0。
            • 您能解释一下原因吗?
            • @RichardAyotte 在英国,如果你这样做,程序员可能有理由被不公平解雇.. :)
            • 如果你把它放在一个有用的名字的函数中,它是不言自明的。我刚刚回答了他的问题,并假设他会将代码放入函数中。
            • @RichardAyotte cacophemism 是的,我明白了,笑脸的原因.. 这不是一个真正的技巧,这就是 JS 的方式,但你关于明显的观点是完全有效的。执行Number(a) + Number(b) + Number(c) 虽然时间更长,但可以让其他程序员更容易看到您的意图。而且我完全支持易于遵循代码的程序员。
            猜你喜欢
            • 2011-03-05
            • 2016-09-19
            • 1970-01-01
            • 2013-09-18
            • 2021-11-14
            • 2019-08-07
            • 2019-04-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多