如何简化嵌套的if语句树

时间:2019-04-04 00:12:21

标签: javascript loops if-statement

我有一个嵌套的if语句树,该树运行一个函数16次(我知道),每次向该函数发送一组不同的元素。

该函数仅返回true或false。

if(!checkSpecial(1,1,1,1)) {
    if(!checkSpecial(1,1,1,0)) {
        if(!checkSpecial(1,1,0,1)) {
            if(!checkSpecial(1,0,1,1)) {
                if(!checkSpecial(0,1,1,1)) {                                
                    if(!checkSpecial(1,1,0,0)) {                            
                        if(!checkSpecial(1,0,0,1)) {                            
                            if(!checkSpecial(0,0,1,1)) {                            
                                if(!checkSpecial(1,0,1,0)) {                            
                                    if(!checkSpecial(0,1,0,1)) {                            
                                        if(!checkSpecial(0,1,1,0)) {                    
                                            if(!checkSpecial(1,0,0,0)) {                    
                                                if(!checkSpecial(0,1,0,0)) {                    
                                                    if(!checkSpecial(0,0,1,0)) {                    
                                                        if(!checkSpecial(0,0,0,1)) {                    
                                                            if(!checkSpecial(0,0,0,0)) {
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }   
} else {
    // do other stuff
}

如您所见,如果函数在这些实例的每个实例中都返回false,我想做其他事情。

如果函数返回true,我什么也不想做。

我的问题是,我知道必须有一种更好的方法来执行此操作,我假设是通过某种循环进行的,但是我不知道这种循环将被调用什么或如何工作

到目前为止,我的解决方法是

for (var i = 0; i < 16; i++) { 
   // HELP!
}

任何指针将不胜感激。谢谢。

5 个答案:

答案 0 :(得分:1)

您可以创建一个数字为0-15的二进制表示形式的数组,然后在调用以数组项作为参数的函数时,检查其中的every是否返回false:

const combinations = Array.from(
  { length: 16 },
  (_, i) => (i >>> 0).toString(2).padStart(4, '0').split('').map(Number)
);

console.log(combinations)
/*
if (combinations.every(combination => checkSpecial(...combination) === false)) {
  // every result was false
} else {
  // at least one result wasn't false
}
*/

答案 1 :(得分:0)

我唯一的建议如下:

  1. 使用每个排列初始化数组

var permutations = [
	[0, 1, 1, 0],
  [1, 1, 1, 0]
];

  1. 遍历这些排列并做您需要的事

permutations.forEach(function(permutation) {
    if (checkSpecial(permutation[0], permutation[1], permutation[2], permutation[3])) {

    } else {

    }
});

答案 2 :(得分:0)

这是一个for循环的想法。将此插入您的VS

     int a = 0;
     int b = 0;
     int c = 0;
     int d = 0;


     for (a = 0; a <= 1; a++)
     {
        for (b = 0; b <= 1; b++)
        {
           for (c = 0; c <= 1; c++)
           {
              for (d = 0; d <= 1; d++)
              {
                 Console.WriteLine($"function({a}, {b}, {c}, {d})");
              }
           }
        }
     }
     Console.ReadKey(); 

答案 3 :(得分:0)

function* bin(){
  yield 0;
  yield 1;
}
function* word(size,prefix){
  if(!prefix){
    prefix=[];
  }
  if(size){
    var b=bin(),
        n;
    while((n=b.next()) && !n.done){
      prefix[size-1]=n.value;
      yield* word(size-1,prefix);
    }
  } else {
    yield prefix;
  }
}

var w=word(4),
    cond=true,
    n;
while((n=w.next())&&!n.done){
  if(checkSpecial.apply(n.value)){
    cond=false;
    break;
  }
}

if(cond){

} else {

}

答案 4 :(得分:0)

你可以做一个像这样的 for 循环..

boolean checkConditions() {
        int[][] cond = {
                {1, 1, 1, 1},
                {1, 1, 1, 0},
                {1, 1, 0, 1},
                {1, 0, 1, 1},
                {0, 1, 1, 1},
                {1, 1, 0, 0},
                {1, 0, 0, 1},
                {0, 0, 1, 1},
                {1, 0, 1, 0},
                {0, 1, 1, 0},
                {0, 1, 0, 1},
                {1, 0, 0, 0},
                {0, 1, 0, 0},
                {0, 0, 1, 0},
                {0, 0, 0, 1},
                {0, 0, 0, 0}};

        for (int i = 0; i < cond.length; i++) {
            if(checkSpecial(cond[i][0], cond[i][1], cond[i][2], cond[i][3])) {
                return false;
            }
        }
        // do other stuff
    }