Для цикла с инструкцией if, не выполняющей итерацию по всему массиву

#javascript #arrays #if-statement #for-loop

#javascript #массивы #if-statement #for-цикл

Вопрос:

Мне неловко задавать такой фундаментальный вопрос. Но если это фундаментальный или простой пробел в моих знаниях js, я бы предпочел получить объяснение, почему, чтобы я мог начать вырабатывать хорошие привычки раньше, чем позже.

У меня есть функция, которая принимает строку в качестве аргумента и сравнивает ее со значениями массива.

 function validateHello(greetings){
var hello = ['hello','ciao','salut','hallo', 'hola', 'ahoj','czesc'];
  for(var i = 0; i < hello.length; i  ){
    if(greetings === hello[i]){ 
      return true;
    }else{ 
      return false;
    }

   }

}
  

Похоже, что каждый раз, когда я запускаю этот цикл for, он проверяет только первый массив hello[0] , а затем, похоже, прерывается. Как я могу предотвратить это? Я попытался использовать continue; after return true, но это тоже не помогло. Я чувствую, что должен это знать, но я полностью запутался и не могу понять, почему.
Спасибо!

Ответ №1:

Это из-за вашего return false оператора, вы должны поместить его вне цикла и удалить else оператор:

 function validateHello(greetings){
var hello = ['hello','ciao','salut','hallo', 'hola', 'ahoj','czesc'];
  for(var i = 0; i < hello.length; i  ){
    if(greetings === hello[i]){ 
      return true;
    }
  }
  return false;
}
  

Объяснение: Когда greetings аргумент не равен первому элементу 'hello' , тогда код выполнит else оператор, который возвращает false и останавливает выполнение функции.

Ответ №2:

Ваши return операторы выходят из функции. Если вы удалите return операторы, он будет проходить через весь массив (хотя похоже, что вы на самом деле ничего не делаете, поэтому я не знаю, как вы это узнаете).

Если вы просто хотите вернуть значение true, если greetings оно находится в массиве, то это то, что вы ищете:

 function validateHello(greetings){
var hello = ['hello','ciao','salut','hallo', 'hola', 'ahoj','czesc'];
  for(var i = 0; i < hello.length; i  ){
    if(greetings === hello[i]){ 
      return true;
    } 
   }
    return false;
}
  

Обратите внимание, что возвращаемое значение false было перемещено за пределы цикла. Таким образом, он вернет true, как только greetings будет найден, в противном случае он завершит цикл, а затем вернет false .

Ответ №3:

Я добавляю примечания в ваш код и изменяю неправильную часть. Удалите else блок и return false; выведите его из for цикла. Это создаст полный for цикл. Единственным условием if оператора является true то, for что цикл будет return . И если for цикл завершается без возврата, return false; будет выполнен следующий оператор.

 function validateHello(greetings){
    var hello = ['hello','ciao','salut','hallo', 'hola', 'ahoj','czesc'];
    for(var i = 0; i < hello.length; i  ){
        if(greetings === hello[i]){ 
            return true;
        }
        /* if you add a else block here. it means you want your 'else condition' to be checked in every single loop. Since 'if statement has a 'return' and 'else' statement has a 'return'. So if there is a 'else' here, no matter what condition you add , your for loop can only be executed once.  */
    }
    return false; // only the for loop is over and no return. this statement will be executed.
}