Есть ли лучший способ уменьшить несколько операторов if? - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть функция, которая проверяет несколько различных условий.Вот пример моей функции:

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 голосов
/ 01 февраля 2019

Вы можете реорганизовать свои операторы if, используя троичный оператор.Но есть вероятность, что это сделает ваш код намного сложнее для чтения.Вы можете заменить

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

на return check;, так как в любом случае это логическое выражение.

Кроме того, для удобства чтения было бы неплохо пометить переменные поля как-то более значимые., поскольку знание того, что fld2 всегда должно быть больше fld4, не сразу очевидно из названия.

И если вам не нужно выделять конкретные коды ошибок, вы, конечно, можете объединить некоторыеваших проверок вместе и просто верните false без указанных кодов ошибок, но я подозреваю, что вы захотите сохранить эту функциональность.

0 голосов
/ 01 февраля 2019

Вся переменная 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>
0 голосов
/ 01 февраля 2019

В этом сценарии использования я думаю, что решение 'множественные if' вполне понятно, поэтому его нужно использовать.

Если вы хотите немного оптимизировать, я могу предложить только

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

, чтобы стать

return !!check;

(два восклицательных знака просто приводят любой объект в логическое значение: -))

...