检查三个布尔值中的两个是不是为真?

Posted

技术标签:

【中文标题】检查三个布尔值中的两个是不是为真?【英文标题】: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 是的,我看到了一个,但我的问题有所不同,因为这种情况“至少”有两个……这意味着第三个也可能是真的,但在我的情况下不是。跨度> 【参考方案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;

参考资料:

Array.prototype.filter()Boolean()

【讨论】:

【参考方案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) 虽然时间更长,但可以让其他程序员更容易看到您的意图。而且我完全支持易于遵循代码的程序员。

以上是关于检查三个布尔值中的两个是不是为真?的主要内容,如果未能解决你的问题,请参考以下文章

检查数组中的所有布尔值是不是为真?

检查数组中的所有值是不是为真,然后返回一个真布尔语句(javascript)[重复]

C# 三个布尔值,一次为真 [关闭]

如何检查任何多个“错误”布尔值是不是为真?

加入多个布尔值

如何测试多个(2个或更多)布尔值是不是为真