检查三个布尔值中的两个是不是为真?
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(和大多数其他现代编码语言)中,布尔变量可以存储为二进制整数(1
和 0
),这些整数可以用作布尔值。看这个例子:
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 在英国,如果你这样做,程序员可能有理由被不公平解雇.. :) 如果你把它放在一个有用的名字的函数中,它是不言自明的。我刚刚回答了他的问题,并假设他会将代码放入函数中。 @RichardAyottecacophemism
是的,我明白了,笑脸的原因.. 这不是一个真正的技巧,这就是 JS 的方式,但你关于明显的观点是完全有效的。执行Number(a) + Number(b) + Number(c)
虽然时间更长,但可以让其他程序员更容易看到您的意图。而且我完全支持易于遵循代码的程序员。以上是关于检查三个布尔值中的两个是不是为真?的主要内容,如果未能解决你的问题,请参考以下文章