У меня есть оператор switch. Он почти работает нормально, однако вместо того, чтобы просто показывать один случай, он показывает выбранный случай, а затем значение по умолчанию. Вот мой код:
var people = {
names: ["Sam", "Tim", "Steve"],
emails: ["[email protected]", "[email protected]", "[email protected]"],
phonenums: [1111, 2222, 4545]
}
var search = prompt("Type in someone's name to find their phone number and email.");
switch (search) {
case people.names[0]:
alert(people.names[0] + "'s email: " + people.emails[0] + " phone number: " + people.phonenums[0]);
case people.names[1]:
alert(people.names[1] + "'s email: " + people.emails[1] + " phone number: " + people.phonenums[1]);
case people.names[2]:
alert(people.names[2] + "'s email: " + people.emails[2] + " phone number: " + people.phonenums[2]);
default:
alert("I don't know that person.");
}
Почему это происходит?
Возможный дубликат Странное поведение переключателя JavaScript
Потому что у вас нет break
в ваших переключателях.
Проверьте документацию по оператору switch
на МДН. О break
(акцент мой) сказано следующее.
The optional break statement associated with each case label ensures that the program breaks out of switch once the matched statement is executed and continues execution at the statement following switch. If break is omitted, the program continues execution at the next statement in the switch statement.
Поэтому обновите свои дела, чтобы они выглядели как
case people.names[0]:
alert(people.names[0] + "'s email: " + people.emails[0] + " phone number: " + people.phonenums[0]);
break;
Вам необходимо предоставить оператор break
Вам нужно поставить breaks в операторе switch, если вы не хотите, чтобы работало значение по умолчанию. Просто сделайте это:
var people = {
names : ["Sam", "Tim", "Steve"],
emails : ["[email protected]", "[email protected]", "[email protected]"],
phonenums : [1111, 2222, 4545]
}
var search = prompt("Type in someone's name to find their phone number and email.");
switch(search) {
case people.names[0]:
alert(people.names[0] + "'s email: " + people.emails[0] + " phone number: " + people.phonenums[0]);
break;
case people.names[1]:
alert(people.names[1] + "'s email: " + people.emails[1] + " phone number: " + people.phonenums[1]);
break;
case people.names[2]:
alert(people.names[2] + "'s email: " + people.emails[2] + " phone number: " + people.phonenums[2]);
break;
default:
alert("I don't know that person.");
}
В вашем конкретном сценарии вам может быть лучше искать индекс правильного человека и использовать его, чтобы ваш массив мог свободно увеличиваться и уменьшаться. Что-то вроде этого может работать:
var search = prompt("Type in someone's name to find their phone number and email.");
boolean found = false;
int i = 0;
while(!found && i<people.names.length) {
if (people.names[0] == search){
found=true;
} else {
i++;
}
}
if (found){
alert(people.names[i] + "'s email: " + people.emails[i] + " phone number: " + people.phonenums[i]);
} else {
alert("I don't know that person.");
}
Мой js ржавый, и я использую свой телефон, я проверю позже на наличие синтаксических ошибок, если никто не заметит их.
Ну это было глупо. У меня было ощущение, что я что-то забыл. Спасибо.
Легко делается. Кстати, еще раз взглянув на свой код, вы, возможно, захотите применить другой подход. Как и сейчас, вам нужно жестко закодировать каждое число, которое может появиться. Если вместо этого вы искали массив (цикл while мог бы работать достаточно просто), а затем использовали индекс, по которому был найден человек, тогда ваш массив мог бы свободно увеличиваться или уменьшаться.
Собственно, именно это я и собирался сделать дальше :)
Я только что вытащил возможный код для этого в ответе, который вы можете попробовать, если хотите.
Спасибо за это. Я, скорее всего, буду использовать его.
Код также доступен здесь: jsfiddle.net/theratcoder/bkvt85me/39