代码之家  ›  专栏  ›  技术社区  ›  espresso_coffee

有没有更好的方法来减少多个if语句?

  •  0
  • espresso_coffee  · 技术社区  · 5 年前

    我有一个函数可以验证几个不同的条件。以下是我的函数示例:

    function checkData() {
      var errorMsg = "",
        fld1 = 0, //Number(document.getElementById('fld1').value),
        fld2 = 5, //Number(document.getElementById('fld2').value),
        fld3 = 1, //Number(document.getElementById('fld3').value),
        fld4 = 0; //Number(document.getElementById('fld4').value);
    
      if (!fld1) {
        errorMsg += "Error 1\n\n";
      }
    
      if (fld1 === fld4) {
        errorMsg += "Error 2\n\n";
      }
    
      if (fld2 > fld4) {
        errorMsg += "Error 3\n\n";
      }
    
      if (fld3 > 3) {
        errorMsg += "Error 4\n\n";
      }
    
      if (errorMsg !== "") {
        var check = confirm(errorMsg + "\n Do you want to submit the form?");
    
        if (check) {
          return true;
        } else {
          return false;
        }
      }
    
      return true;
    }
    <button onclick="checkData();">Click Here</button>

    在上面的示例中,为了测试目的,我硬编码了一些值。但是,我想知道是否可以重构这段代码,并找到更好的方法来获得相同的结果?三元运算符是否更适合?或者有其他方法让它发挥作用?谢谢您。

    3 回复  |  直到 5 年前
        1
  •  3
  •   MarcoS    5 年前

    在这个用例中,我认为“多个IFS”解决方案是非常清楚的,所以它是要使用的解决方案。

    如果你想优化一点,我只能建议

            if(check){
                return true;
            }else{
                return false;
            }
    

    成为

    return !!check;
    

    (这两个感叹号只是将任何对象强制转换为布尔值:-)

        2
  •  1
  •   Alen.Toma    5 年前

    整体 check 变量是无意义的。所以 return confirm 你只需要

    function checkData() {
    	var errorMsg = "",
    		fld1 = 0, //Number(document.getElementById('fld1').value),
    		fld2 = 5,//Number(document.getElementById('fld2').value),
    		fld3 = 1,//Number(document.getElementById('fld3').value),
    		fld4 = 0;//Number(document.getElementById('fld4').value);
    
    	if(!fld1){
    		errorMsg += "Error 1\n\n";
    	}
    
    	if(fld1 === fld4){
    		errorMsg += "Error 2\n\n";
    	}
    
    	if(fld2 > fld4){
    		errorMsg += "Error 3\n\n";
    	}
    
    	if(fld3 > 3){
    		errorMsg += "Error 4\n\n";
    	}
    
        return errorMsg !== "" ? confirm(errorMsg + "\n Do you want to submit the form?") : true
    
    }
    <button onclick="checkData();">Click Here</button>
        3
  •  0
  •   Adam    5 年前

    可以使用三元运算符重构if语句。但很可能它会使您的代码更难阅读。你可以替换

    if(check){
        return true;
    }else{
        return false;
    }
    

    用公正 return check; 因为这是一个布尔语句。

    此外,就可读性而言,最好给字段变量贴上更有意义的标签,因为知道 fld2 应该总是大于 fld4 从名字上看并不明显。

    如果您不关心突出显示特定的错误代码,那么您当然可以将一些检查合并在一起,然后返回 false 如果没有指定的错误代码,但我怀疑您希望保留该功能。