【问题标题】:Simplifing If Statements简化 If 语句
【发布时间】:2018-11-18 19:23:21
【问题描述】:

我正在处理一项作业,并且我非常了解 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 语句字符串。我试图想出不同的方式来进行切换,但不认为这是可能的。这可能是最优雅的解决方案?

【问题讨论】:

    标签: javascript if-statement switch-statement


    【解决方案1】:

    您可以获取一个数组并使用布尔值作为回调进行检查。

    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));
    

    【讨论】:

    • 现在是时尚的 JS!
    • 不错。只是可惜它不允许短路评估。
    【解决方案2】:

    假设您首先拥有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));
    

    这个想法是您只初始化一次 formpropspatts 变量,而不是每次需要执行验证时,尽管这样做不会有问题。

    【讨论】:

      【解决方案3】:

      假设每个值都是布尔值,您可以为布尔值执行逻辑 &&

      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}$/);
      

      【讨论】:

      • 我想过这个,那会是一个很长的陈述
      猜你喜欢
      • 2015-09-12
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2014-06-18
      相关资源
      最近更新 更多