写if if的更有效方法

时间:2013-09-16 17:47:06

标签: javascript

我为输入字段写了一点检查,计算长度并确保它是正确的数量。它变得复杂,因为它需要允许9位数或1个字母和5位数。我现在的方式有效,但代码伤害了我的大脑,我想看看更优雅的解决方案是什么样的,可能使用三元和/或开关?

所以现在我所拥有的一小部分不那么漂亮了:

if (len !== 9) {
    if (len == 1) {
        y.hide();
        n.show();
        valInput.text("You need 8 more numbers");
    } else {
        if (len == 2) {
            y.hide();
            n.show();
            valInput.text("You need 7 more numbers");
        } else {
            if (len == 3) {
                y.hide();
                n.show();
                valInput.text("You need 6 more numbers");
            } else {
                if (len == 4) {
                    y.hide();
                    n.show();
                    valInput.text("You need 5 more numbers");
                } else {
                    if (len == 5) {
                        y.hide();
                        n.show();
                        valInput.text("You need 4 more numbers");
                    } else {
                        if (len == 6) {
                            y.hide();
                            n.show();
                            valInput.text("You need 3 more numbers");
                        } else {
                            if (len == 7) {
                                y.hide();
                                n.show();
                                valInput.text("You need 2 more numbers");
                            } else {
                                if (len == 8) {
                                    y.hide();
                                    n.show();
                                    valInput.text("You need 1 more number");
                                } else {
                                    if (len > 9) {
                                        y.hide();
                                        n.show();
                                        valInput.text("Order number must be 9 digits");
                                        // gt 9
                                    }
                                    // 8
                                }
                                // 7
                            }
                            // 6
                        }
                        // 5
                    }
                    // 4
                }
                // 3
            }
            // 2
        }
        // 1
    }
    // this is not equal to 9
}

更新

感谢所有答案!很多好东西,我会在玩了一段时间后接受我最喜欢的东西。为了澄清满足适当要求时会发生什么,然后提交按钮会淡入但不会被验证。不确定它是否相关,但会提到该函数也以“实时类型”运行,因此在每个.keyup()之后返回带有计数的消息

7 个答案:

答案 0 :(得分:5)

如果您不想使用开关,可以执行以下操作:

if (len < 9) {
    y.hide();
    n.show();
    valInput.text("You need " + (9 - len) + " more number(s)");
}
else if (len > 9) {
    y.hide();
    n.show();
    valInput.text("Order number must be 9 digits");
}
else {
    // all good here...
}

如果您不喜欢"number(s)"部分,只需检查len是否不是1,然后将"s"添加到"number"

答案 1 :(得分:4)

因为那些看起来一样,为什么不使用它:

if (len !== 9) {
    var diff = 9 - len;
    var value = ( 0 < diff ? "You need " + diff + " more numbers" : "Order number must be 9 digits" );
    y.hide();
    n.show();
    valInput.text(value);
}

答案 2 :(得分:4)

我认为你应该通过javascript计算剩余的字符,因为这是所有其他if else分支的唯一区别,所以你可以做这样的事情并且更具可读性:

if (len !== 9) {
    y.hide();
    n.show();
    if (len > 9) {
        valInput.text("Order number must be 9 digits");
    }
    else{
        var remaining = 9 - len;
        valInput.text("You need " + remaining + " more numbers");
    }
}

答案 3 :(得分:3)

在您的特定情况下,对于类似的内容,验证看起来很简单:

function validate(len) {
    var msg;
    if (len == 9)
        return true;
    y.hide(); /* no need to duplicate these calls in each condition */
    n.show();
    if (len < 9)
        msg = 'You need ' + (9-len) + ' more number' + (len == 1 ? '' : 's') + '.';
    else
        msg = 'You entered ' + (len-9) + ' number' + (len == 1 ? '' : 's') + ' too many.;
    valInput.text(msg);
    return false;

}

评论: ===应该在需要时保存,而不仅仅是花哨!不幸的是,许多人被教导要避免双重平等,而不是真正理解其有用和有用的额外功能,如类型转换。在这种情况下,没有任何理由使用三等于。

但总的来说,例如,如果你的条件序列比警告一系列仅由连续整数变化的消息更重要,那么使用switch ......

switch (len) {
case 1:

/* handle this case */;
    y.hide();
    n.show();
    valInput.text("You need 8 more numbers");
    break;
/* make sure to end case 1 with a break; */

case 2:
    y.hide();
    n.show();
    valInput.text("You need 7 more numbers");
    break;
/* make sure to end every case with a break; */

...
}

答案 4 :(得分:2)

您可以将其简化为:

  if (len !== 9) {
      valInput.text("You need " +  (9 -len ) + " more numbers");
       y.hide();
      n.show();
   }

答案 5 :(得分:2)

为什么甚至使用switch或巨大的if

if(len == 9){
    // do stuff.
}else{
    y.hide();
    n.show();
    if(9 > len)
         valInput.text("You need " + (len - 9) + " less numbers");
    else 
         valInput.text("You need " + (9 - len) + " more numbers");
    valInput.text("Order number must be 9 digits");
}

只需声明所需值的范围,然后concatenate字符串。

答案 6 :(得分:0)

最短的选择:

(y.hide(), n.show(), valInput.text(
     len < 9 &&  "You need " + (9-len) + " more digits"
  || len > 9 && "too many ("+ (len-9) + ") digits" 
  || "ok!"
));