动态测试多个条件?

时间:2013-06-19 00:48:23

标签: javascript

我的问题是荒谬的,或者我正在寻找错误的东西,因为我找不到类似的东西。我想知道我是否可以动态创建具有多个条件的if语句?我能在现场想到的唯一方法就是:

function someTest( numOne, numTwo ) {
for (var i = numOne; i < numTwo; i++) {
   if (someCol[i].test === false) {
    return false;
   }
}
}

someTest( 20, 35 );

这只是一个例子来向你展示我的意思,因为它经历了多个if语句,如果它们中的任何一个都不是真的,那么它返回false,而'short-circuits'就像一个普通的if语句,带有&amp;&amp;多重&amp;&amp;参数&amp;&amp; 。但是这种强迫你使用表并使其他语句更复杂。如果有人有任何建议或更好的方法,请告诉我们。感谢您的任何输入

编辑:这有点复杂,但如果你坚持:-P。我有6行,每行有4列。因此,无论你想称呼它们,总共有24个“细胞”或“盒子”。你可以加上或减去每个盒子,但它比这更棘手。您需要在第一行中至少有4个'点'才能访问第二行,因此要访问第4行,您至少需要12个点。

添加点很容易,它可以消除变得复杂的点。因为您不能只添加前3列,如果有超过12个点,您可以从第4列中删除一个点,以防第4列上方的列中有点,因为您仍然需要例如,第6列中有点的最小点数。这有意义吗?我将尝试创建一个快速的jsfiddle来向您展示一个正在运行的示例。给我几点

EDIT2: http://jsfiddle.net/zBcBd/3/

仍然在努力,但正如你所看到的,你不能在第二行添加点,除非第一行至少有4个点,然后你不能在第三行添加点,直到至少有共8分。这是一个简单的部分,我想要完成的是删除点,但它必须测试一切。因此,例如,如果第6行中有分数,那么你不能从第5行中删除任何分数,除非有超过21分仍然支持第6行,有意义吗?

1 个答案:

答案 0 :(得分:5)

一种做聪明语法的方法是让一个函数数组返回boolean。

function biggerThanThree(){
    return x>3;
}
function smallerThanFive(){
    return x<5;
}

var predicates = [biggerThanThree,smallerThanFive];

//matches all conditions
var valid = predicates.reduce(function(x,y){return x&&y(); },true);
//matches any condition
var somevalid = predicates.reduce(function(x,y){return x||y(); },true);

Here is a fiddle

根据您的特定需求,您可以做一些更聪明的事情并生成您动态检查的功能:

var rows = [["+","+","+","-","-","+"],["+","+","+","-","-","+"],["+","+","+","-","-","+"]];
// accepts a row number and asserts that enough elements are in so far
function soFarHasMore(upToRowNum){
    var sum = 0;
    for(var i=0;i<upToRowNum;i++){
        sum+=rows[i].filter(function(x){return x==="+"}).length;
    }
    console.log(sum);
    return sum>=4*upToRowNum;
}

var predicates = [];
// generate functions dynamically and fixate their value of `i`
for(var i=0;i<3;i++){
    predicates.push(soFarHasMore.bind(null,i+1));//pushes predicates dynamically    
}

var valid = predicates.reduce(function(x,y){return x&&y(); },true);//matches all conditions

here is a working demo of that

注意:我使用reduce和||和&amp;&amp;因为我喜欢减少。但是,我认为有更多的语义版本可用:

predicates.every(function(elem){ // Same as &&
    return elem();
};

predicates.some(function(elem){ // Same as ||
    return elem();
};