2016-01-04 156 views
1

我想提示用戶輸入,如果它不是一個有效的選項reprompt直到輸入一個有效的輸入。while循環中的多個條件 - Javascript

現在它總是重新報酬無關緊要,正確與否。

下面是代碼:

var userChoice = prompt("Do you choose rock, paper, scissors or rope?"); 
while (userChoice != "rock" || "paper" || "scissors" || "rope") { 
    userChoice = prompt("Sorry invalid input, please enter either: rock, paper,scissors, or rope."); 
} 

看起來這應該是一個簡單的事情,我誤解了如何while循環使用?也許運營商錯了? 一直沒有找到有用的東西,任何幫助表示讚賞!

+1

繩子是如何工作的? – djechlin

+1

@djechlin對於遊戲最終無聊之後掛斷自己,立即失敗。 ;-) –

回答

2

雖然userChoice不等於任何的選擇... SO和

while (userChoice != "rock" && userChoice != "paper" && userChoice != "scissors" && userChoice != "rope") { 
2

語法"rock" || "paper"是有效的,但或將在稍後結合非平等的檢查,所以基本上你寫:

while ((userChoice != "rock") || "paper" || "scissors" || "rope") { 
    //... 
} 

現在,既然你使用這樣或那樣,你基本上做了有效性檢查,至少"paper"是有效的。然而,你可以得到你的目標的行爲,通過明確的檢查和使用&&操盤的||的:

while (userChoice !== "rock" && userChoice !== "paper" && userChoice !== "scissors" && userChoice !== "rope") { 
    //... 
} 
2

也許數組是聰明與Array.prototype.indexOf()使用。

var userChoice; 
 
while (!~["rock", "paper", "scissors", "rope"].indexOf(userChoice)) { 
 
    userChoice = prompt("Sorry invalid input, please enter either: rock, paper,scissors, or rope."); 
 
}

3

您也可以使用更復雜的規則的陣列和的indexOf

var userChoice = prompt("rock, paper, scissors, rope?").toLowerCase(); 
while (["rock", "paper", "scissors", "rope"].indexOf(userChoice) === -1) { 
    userChoice = prompt("Please choose: rock, paper, scissors, rope?").toLowerCase(); 
} 

alert("You chose '" + userChoice + "'"); 
+0

首先謝謝你的幫助,所以讓我試着解釋你的代碼,我真的是這個哈哈! 初始提示請求選擇(全部以小寫顯示),然後在while循環中使用字符串「rock」等創建數組, 「rock」爲0,「paper」在該數組中爲1? 然後indexof(userchoice)搜索我想要的輸入數組的參數。 -1表示它是否沒有任何正確的答案,它會重新提示,如果正確,將顯示與警報的選擇?那對嗎? –

+0

只是擡頭.index所以可以看到-1意味着不成功的搜索,.indexOf和str.search之間是否有任何有意義的區別?他們似乎都提供了類似的功能 –

+0

您的第一個評論聽起來像是對代碼的正確理解。 [Strings](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf)有一個indexOf函數,它的功能與[array](https:/ /developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)的indexOf(提供找到的項目的偏移量,如果不匹配,則爲-1)。 – smcd

2

(如忽略大小寫),可以使用正則表達式,例如match

while(! userChoice.match(/^\s*(?:rock|paper|scissors|rope)\s*$/i)) { ... } 

(見https://regex101.com/r/sV3tJ1/1#javascript正則表達式的解釋)

注:感謝威廉·Onsem的建議正則表達式


產品相關圖片的對象常量:

var validChoices = {rock: true, 
        paper: true, 
        scissors: true, 
        rope: true}, 
    userChoice = ... 
while (! validChoices.hasOwnProperty(userChoice)) { 
    ... 
} 

ES6 Set截至2016年的最新瀏覽器:new Set(["rock", "paper", ...])

+1

如果你想檢查一個*巨大的*值集,一個正則表達式可能會更有效率。然而,+1創造力;) –

+0

@WillemVanOnsem實際上,正則表達式會更好,即使對於在這個特定問題中接受雜散空間的大小寫不敏感的解決方案,感謝您的建議 – Aprillion