2016-09-04 3 views
1

Я пытаюсь сравнить каждый элемент массива с пользовательским вводом для генерации сообщения, если вход пользователя не соответствует ни одному элементу массива. Код, который я использую, приведен ниже.Сравнение переменной с элементом массива (java script)

var guess_input; 
var finished = false; 
var colors = ["Aqua", "BurlyWood", "Cornsilk", "DarkGrey", "DarkRed", "Indigo", "LightGrey"]; 

while (!finished) { 
      guess_input = prompt("I'm thinking of one of these colors:\n\n" + "Aqua, BurlyWood, Cornsilk, DarkGrey, DarkRed, Indigo, LightGrey" + "\n\nWhat is the color I'm thinking of?"); 
      finished = check_guess(); 
      } 
     } 
     function check_guess() { 

     if (guess_input != colors[0] || guess_input != colors[1] || guess_input != colors[2] || guess_input != colors[3]) { 
      alert("Sorry, I don't recognize that color!\n\n" + "Please try again."); 
      return false; 
     } 
} 

проблема с этим кодом заключается в том, что если я выбираю только один элемент из массива, он отлично работает. но когда я использую оператор «OR», он не работает. Есть ли лучший способ сделать это? Я новичок в java-скрипте.

Спасибо!

+0

Почему вы объявить функцию внутри вашего цикла? Объявите его снаружи, поэтому вы не выполняете итерацию по созданию функции каждый раз –

+0

Использование array.prototype.find() будет более эффективным –

+0

@Jonasw, это будет работать только в том случае, если все элементы будут проверяться, но не только его часть , подобно элементу 0 ... 2. –

ответ

1

Вы можете использовать оператор logical AND&&, так как вам нужно проверить все цвета, которые необходимо проверить.

if (guess_input != colors[0] && guess_input != colors[1] && guess_input != colors[2] && guess_input != colors[3]) { 
    alert("Sorry, I don't recognize that color!\n\n" + "Please try again."); 
    return false; 
} 

Для рабочего кода, вам необходимо вернуть true для найденного цвета, а также.

var guess_input; 
 
var finished = false; 
 
var colors = ["Aqua", "BurlyWood", "Cornsilk", "DarkGrey", "DarkRed", "Indigo", "LightGrey"]; 
 

 
while (!finished) { 
 
    guess_input = prompt("I'm thinking of one of these colors:\n\n" + "Aqua, BurlyWood, Cornsilk, DarkGrey, DarkRed, Indigo, LightGrey" + "\n\nWhat is the color I'm thinking of?"); 
 
    finished = check_guess(); 
 
} 
 

 
function check_guess() { 
 
    if (guess_input != colors[0] && guess_input != colors[1] && guess_input != colors[2] && guess_input != colors[3]) { 
 
     alert("Sorry, I don't recognize that color!\n\n" + "Please try again."); 
 
     return false; 
 
    } 
 
    return true; // necessary, otherwise the function returns undefined, which is a falsy value 
 
}

0

Вам нужно сравнить guess_input против элементов в массиве colours. Это идеальная работа для метода Array.prototype.some(), который возвращает true или false в зависимости от состояния, определенного в его callback. Например ...

var test_guess = colours.some(function(color) { 
    /* 'color' = each item in 'colours' */ 
    return color === guess_input; 
}); 

if (test_guess) { 
    /* correct ..... */ 
} else { 
    /* incorrect .... */ 
} 

Здесь .some() начинает перебирать все элементы в массиве colours, пока условие не возвращает true. Переменная test_guess будет true, если гадание соответствует цвету, в противном случае false.

См: Array.prototype.some() @ MDN

Смежные вопросы