0

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

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

someTest( 20, 35 );

这只是向您展示我的意思的一个示例,因为它经历了多个 if 语句,并且如果其中任何一个不是 true,则返回 false 和“短路”,就像带有 && 多个 && 参数 && 的普通 if 语句一样。但是这有点强迫你使用表,并使 else 语句更复杂。如果有人有任何建议或更好的方法,请告诉。感谢您的任何意见

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

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

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

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

4

1 回答 1

5

一种巧妙的语法方法是让一组函数返回布尔值。

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);

这是一个小提琴

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

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

这是一个工作演示

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

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

predicates.some(function(elem){ // Same as ||
    return elem();
};
于 2013-06-19T01:01:21.223 回答