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

时间:2019-02-01 15:35:33

标签: javascript if-statement ternary-operator

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

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 个答案:

答案 0 :(得分:3)

在这种用例中,我认为“多重假设”解决方案非常清楚,因此可以使用。

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

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

成为

return !!check;

(这两个感叹号只是将任何对象投射到布尔值中:-))

答案 1 :(得分:1)

整个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>

答案 2 :(得分:0)

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

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

仅使用return check;,因为这仍然是布尔语句。

就可读性而言,最好将字段变量标记为更有意义的名称,因为从名称中并不立即知道fld2应该总是大于fld4

如果您不希望突出显示特定的错误代码,那么您当然可以合并一些检查,并只返回false而未指定错误代码,但是我怀疑您会希望保留该错误代码功能。