嵌套if语句的程序逻辑

Programatic logic for nested if statements

本文关键字:程序 if 语句 嵌套      更新时间:2023-09-26

试图将一些重复性很强的代码重写成某种循环,并弄清楚其中的逻辑在一定程度上让我感到头疼。

原始代码看起来有点像这样:

if(a){
    if(b == "foo1"){
        if($('#foo2').val() == a || $('#foo3').val() == a || $('#foo4').val() == a || $('#foo5').val() == a || $('#foo6').val() == a){
            //do something here
        }
    }
}
if(a){
    if(b == "foo2"){
        if($('#foo1').val() == a || $('#foo3').val() == a || $('#foo4').val() == a || $('#foo5').val() == a || $('#foo6').val() == a){
            //do something here
        }
    }
}
if(a){
    if(b == "foo3"){
        if($('#foo1').val() == a || $('#foo2').val() == a || $('#foo4').val() == a || $('#foo5').val() == a || $('#foo6').val() == a){
            //do something here
        }
    }
}
if(a){
    if(b == "foo4"){
        if($('#foo1').val() == a || $('#foo2').val() == a || $('#foo3').val() == a || $('#foo5').val() == a || $('#foo6').val() == a){
            //do something here
        }
    }
}
 if(b == "foo5"){
        if($('#foo1').val() == a || $('#foo2').val() == a || $('#foo3').val() == a || $('#foo4').val() == a || $('#foo6').val() == a){
            //do something here
        }
    }
}
if(b == "foo6"){
        if($('#foo1').val() == a || $('#foo2').val() == a || $('#foo3').val() == a || $('#foo4').val() == a || $('#foo5').val() == a){
            //do something here
        }
    }
}

我想把它重写成一个(或多个)循环,但我很难把逻辑弄对。

到目前为止,我有这个:

if (a){
    for (i=0; i < 6; i++){
        var fieldNames =[ "foo1", "foo2", "foo3", "foo4", "foo5", "foo6"]
        console.log("i loop "+ fieldNames[i]);
        if(b == fieldNames[i]){
            for (j = 1; j < fieldNames.length; j++){
                if($('#'+fieldNames[j]).val() == a){
                     //do something here
                     }
                  }
               }
         }
    }

我知道这是不对的,但有人能帮我弄清楚逻辑应该是什么吗?

感谢

编辑:

应澄清变量指的是什么。

这个函数是从onblur事件上的一个元素内联调用的,行为doCheck(this.value, 'foo1')(这个例子只涉及它的第一个实例,b输入是第二个foo2,第三个foo3,依此类推…

完整的功能如下:

function doCheck(a,b)
  if (a){
    for (i=0; i < 6; i++){
    var fieldNames =[ "foo1", "foo2", "foo3", "foo4", "foo5", "foo6"]
    console.log("i loop "+ fieldNames[i]);
    if(b == fieldNames[i]){
        for (j = 1; j < fieldNames.length; j++){
            if($('#'+fieldNames[j]).val() == a){
                 //do something here
                 }
              }
           }
     }
  }
}

因此,变量a是select元素中的值,而b变量是字段名。

您可以生成一个可能字段的列表,从该列表中删除b,然后与其余字段进行比较。

if (a) {
    var fieldNames = ['foo1', 'foo2', 'foo3', 'foo4', 'foo5', 'foo6'];
    // Remove b from the fields
    fieldNames.splice(fieldNames.indexOf(b), 1);
    var doSomething = fieldNames.reduce(function(prev, fieldName) {
        return prev && $('#' + fieldName).val() === a;
    }, true);
    if (doSomething) {
      // do something
    }
}

另一种看待这一问题的方法是这样的:

if (a) {
  var fieldNames = ['foo1', 'foo2', 'foo3', 'foo4', 'foo5', 'foo6'];
  // Remove b from the fields
  fieldNames.splice(fieldNames.indexOf(b), 1);
  var doSomething = true;
  for (var i = 0; i < fieldNames.length; i++) {
    if ($('#' + fieldNames[i]).val() !== a) {
      doSomething = false;
      break;
    }
  }
  if (doSomething) {
    // do something
  }
}

我认为你的问题应该在这里:

if($('#fieldNames[j]').val() == a){

使用修复

if($('#' + fieldNames[j]).val() == a){

此外,你的循环可能会像这样更新,

 var fieldNames =[ "foo1", "foo2", "foo3", "foo4", "foo5", "foo6"];
// Define fieldNames before the first loop
if (a){
    for (i=0; i < fieldNames.length; i++){
        console.log("i loop "+ fieldNames[i]);
        if(b == fieldNames[i]){
            for (j = 1; j < fieldNames.length; j++){ // WHY YOU START AT j=1 ? I shall start at j=0 in my opinion
                if($('#fieldNames[j]').val() == a){
                     //do something here
                     break; // <=== EXIT 2nd LOOP IF YOU FIND SOMETHING
                     }
                  }
               }
               break; // <=== EXIT 1st LOOP IF YOU FIND SOMETHING
         }
    }

我不确定您是否希望//do something here对于原始代码中的所有if块都是相同的。如果你想要相同的,那么你可以按照你的建议进行循环,否则就不行。

为什么不将值(即$('#foo2').val())放入数组中,并使用数组上的indexOf()函数测试a和b?

var fieldValues =[ $("#foo1").val(), $("#foo2").val(), etc];
if(fieldValues.indexOf(a)!=-1 || fieldValues.indexOf(b)!=-1){
    //do something here
}