嵌套if语句的编程逻辑

时间:2015-06-24 16:28:49

标签: javascript arrays loops

尝试将某些非常重复的代码重写为某种循环,并且弄清楚逻辑会在某种程度上煎炸我的大脑。

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

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
                     }
                  }
               }
         }
    }

我知道这不对,但任何人都可以帮我解释逻辑应该是什么吗?

由于

修改

应澄清变量所指的内容。

使用行doCheck(this.value, 'foo1')从onblur事件的元素内联调用此函数(此示例仅涉及第一个实例,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变量是字段名称。

3 个答案:

答案 0 :(得分:2)

您可以生成可能字段列表,从该列表中删除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
  }
}

答案 1 :(得分:0)

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

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

Repalce with:

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
         }
    }

答案 2 :(得分:0)

我不确定您希望//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
}