[英]More efficient way to write this if/else
我為輸入字段寫了一點檢查,該字段計算長度並確保它是正確的數量。 它變得復雜,因為它需要允許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()
之后返回
如果您不想使用switch,可以執行以下操作:
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"
。
看起來一樣,為什么不使用它:
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);
}
我認為您應該通過javascript計算其余字符,因為這是其他所有分支(如果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");
}
}
在您的特定情況下 ,對於這樣的事情,驗證似乎很簡單:
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; */
...
}
您可以將其簡化為:
if (len !== 9) {
valInput.text("You need " + (9 -len ) + " more numbers");
y.hide();
n.show();
}
為什么即使使用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
字符串即可。
最短的選擇:
(y.hide(), n.show(), valInput.text(
len < 9 && "You need " + (9-len) + " more digits"
|| len > 9 && "too many ("+ (len-9) + ") digits"
|| "ok!"
));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.