检查一个布尔选项集

时间:2013-06-25 17:51:31

标签: javascript node.js

嗯,这有点像hacky:

function b2n(boo) {
    return boo ? 1 : 0;
}

if(b2n(opt1) + b2n(opt2) + b2n(opt3) !== 1) {
    throw new Error("Exactly one option must be set");
}

在Javascript中有更好的方法吗?使用

中的任何一个
  • 更智能的布尔/数字处理
  • 偷偷摸摸的阵列或功能操作

等等。欢迎使用Javascript和Node解决方案。

在我的实际问题中,选项来自Node模块指令器,因此我没有处理真正的布尔值,只是简单和虚假的事情。也可能有指挥官解决方案。

6 个答案:

答案 0 :(得分:11)

假设你有一系列选项,你可以这样做:

if(opts.filter(Boolean).length !== 1) {}

在我看来,你应该有一个带有三种可能状态的变量......

var opt = 'a'; // (or 'b', or 'c')

答案 1 :(得分:6)

你可以这样做:

if ( !!opt1 + !!opt2 + !!opt3 !== 1 ) {

这是因为

  • !!从任意值(true生成一个布尔值,如果对象在true中评估为if(value)
  • 添加布尔值时,1获得true0获得false

答案 2 :(得分:1)

我认为你太聪明了,出了什么问题:

var optionsSelected = 0;
if( opt1 ) optionsSelected++;
if( opt2 ) optionsSelected++;
if( opt3 ) optionsSelected++;

if( optionsSelected !== 1 ) {
    throw new Error("Exactly one option must be set");
}

当然我也可以玩这个聪明的游戏:

 if( opts.filter(Boolean).length !== 1 ) {
     throw new Error("Exactly one option must be set");
 }

答案 3 :(得分:1)

您在评论中提到这是来自指挥官选项对象。

您可以使用Lodash更优雅地执行此操作:

if (_(options).values().compact().size() === 1)

如果您只想计算选项的子集,可以插入

.pick('a', 'b', 'c')

答案 4 :(得分:1)

if ([opt1, opt2, opt3].reduce(function(x, y) { return x + !!y }, 0) == 1) {
    // exactly one
};

ECMAScript 5 reduce功能。

答案 5 :(得分:0)

@spudly走在正确的轨道上,但它可能会更紧凑:

if( [opt1,opt2,opt3].filter(function(x){return x}).length!==1 ) {
    throw new Error("Exactly one option must be set");
}

有关详细信息,请参阅ES5's filter method