Упрощение, если заявления - PullRequest
0 голосов
/ 18 ноября 2018

Я работаю над заданием, и мне хорошо известны операторы if и операторы switch.У меня есть эта строка кода:

if (testLength(document.forms[0].lname) == false) {
    isValid = false;
}

if (testLength(document.forms[0].fname) == false) {
    isValid = false;
}

if (testLength(document.forms[0].address) == false) {
    isValid = false;
}

if (testLength(document.forms[0].summary) == false) {
    isValid = false;
}

if (testPattern(document.forms[0].account, /^ACT\d{6}$/) == false) {
    isValid = false;
}

if (testPattern(document.forms[0].department, /^DEPT\d{3}$/) == false) {
    isValid = false;
}

if (testPattern(document.forms[0].project, /^PROJ\d{5}$/) == false) {
    isValid = false;
}

if (testPattern(document.forms[0].ssn, /^\d{3}-\d{2}-\d{4}$|\d{9}$/) == false) {
    isValid == false;
}

Есть ли способ упростить строку операторов if, как это, если они все связаны.Я пытался придумать, как можно переключиться, но не думаю, что это возможно.Это может быть самым элегантным решением?

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Вы можете взять массив и проверить с помощью логического значения в качестве обратного вызова.

isValid = [
    testLength(document.forms[0].lname),
    testLength(document.forms[0].fname),
    testLength(document.forms[0].address),
    testLength(document.forms[0].summary),
    testPattern(document.forms[0].account, /^ACT\d{6}$/),
    testPattern(document.forms[0].department, /^DEPT\d{3}$/),
    testPattern(document.forms[0].project, /^PROJ\d{5}$/),
    testPattern(document.forms[0].ssn, /^\d{3}-\d{2}-\d{4}$|\d{9}$/)
].every(Boolean);

Другой подход - использовать массив имен свойств и использовать два массива для проверки.

var keys = ['name', 'fname', 'address', 'summary'],
    patterns = [
        ['account', /^ACT\d{6}$/],
        ['department', /^DEPT\d{3}$/],
        ['project', /^PROJ\d{5}$/],
        ['ssn', /^\d{3}-\d{2}-\d{4}$|\d{9}$/]
    ],
    isValid = keys.every(k => testLength(document.forms[0][k]))
        && patterns.every((k, p) => testPattern(document.forms[0][k], p));
0 голосов
/ 18 ноября 2018

Предполагая, что каждое значение является логическим, вы можете сделать логическое && для логических значений.

var isValid = testLength(document.forms[0].lname) && 
              testLength(document.forms[0].fname &&
              .....
              testPattern(document.forms[0].ssn, /^\d{3}-\d{2}-\d{4}$|\d{9}$/);
0 голосов
/ 18 ноября 2018

Если у вас сначала есть isValid = true, вы можете сделать это следующим образом:

var form = document.forms[0];
var props = ["lname", "fname", "address", "summary"];
var isValid = props.every(prop => testLength(form[prop]))
           && testPattern(form.account, /^ACT\d{6}$/)
           && testPattern(form.department, /^DEPT\d{3}$/)
           && testPattern(form.project, /^PROJ\d{5}$/) 
           && testPattern(form.ssn, /^\d{3}-\d{2}-\d{4}$|\d{9}$/); 

Вы также можете применить предопределенный подход массива к шаблонам, например так:

var form = document.forms[0];
var props = ["lname", "fname", "address", "summary"];
var patts = [["account", /^ACT\d{6}$/], ["department", /^DEPT\d{3}$/],
             ["project", /^PROJ\d{5}$/], ["ssn", /^\d{3}-\d{2}-\d{4}$|\d{9}$/]];
var isValid = props.every(prop => testLength(form[prop]))
           && patts.every(([prop, regex]) => testPattern(form[prop], regex));

Идея состоит в том, что вы инициализируете переменные form, props и patts только один раз, а не каждый раз, когда вам нужно выполнить проверку, хотя это не будет проблемой, если вы это сделаете.

...