我为输入字段写了一点检查,计算长度并确保它是正确的数量。它变得复杂,因为它需要允许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()
之后返回带有计数的消息
答案 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!"
));