Перебор через массив дает разные результаты

#javascript

#javascript

Вопрос:

У меня есть список массивов: ["April", "May", "June", "July"]

Почему это так if(arr[i] === "June") , result будет отображаться «Найденный месяц», но if(arr[i] === "April") или if(arr[i] === "May") , он будет отображать «Не найден месяц»?

Как я могу пересмотреть код, чтобы result он отображался Found month для April и May ?

 function holidays(arr) {
    let result = ''
    for (let i = 0; i < arr.length; i  ){
        if(arr[i] === "June"){
            result = "Found month"
        } else {result = "Didn't find month"}
    } return result
  } 
  
  const months = ["April", "May", "June"];
  console.log(holidays(months)); 
  

Комментарии:

1. Как только у вас есть совпадение, вы должны немедленно выйти из цикла, иначе следующая итерация уничтожит предыдущий результат.

2. А еще лучше, рассмотрите возможность использования some или find в зависимости от того, что вы пытаетесь выполнить здесь.

3. Важно, как вы форматируете код, особенно с точки зрения того, насколько он удобочитаем и насколько легко вы можете обнаружить ошибки при просмотре кода. Я бы рекомендовал вам использовать какой-нибудь форматировщик кода, например, prettier.

Ответ №1:

Вам нужно опустить not found присваивание, потому что в первом цикле вы не можете знать, появляется ли правильный месяц в следующем цикле.

Поэтому переместите это в конец и завершите работу раньше, чем найдено, потому что вам не нужно повторять остальную часть массива.

 function holidays(arr) {
    for (let i = 0; i < arr.length; i  ) {
        if (arr[i] === "June") {
            return "Found month";
        }
    }
    return "Didn't find month";
}

const months = ["April", "May", "June"];

console.log(holidays(months));  

Используйте короткий подход Array#includes .

 function holidays(arr) {
    return arr.includes("June")
        ? "Found month"
        : "Didn't find month";
}

const months = ["April", "May", "June"];

console.log(holidays(months));  

Ответ №2:

Вы должны выйти из массива, чтобы новый результат не переопределял старый результат.

 function holidays(arr) {
  let result = ''
  for (let i = 0; i < arr.length; i  ) {
    if (arr[i] === "May") {
      result = "Found month"
      break
    } else {
      result = "Didn't find month"
    }
  }
  return result
}

const months = ["April", "May", "June"];
console.log(holidays(months));  

Ссылка на MDN для break : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/break

Но, если вам нужно проверить, содержит ли массив что-то, вы должны использовать Array.includes :

 function holidays(arr) {
  return (arr.includes("May") ? "Found": "Not found")
}

const months = ["April", "May", "June"];
console.log(holidays(months));  

Ссылка на MDN для Array.prototype.includes : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

Кроме того, в приведенном выше примере для Array.includes я использовал нечто, называемое троичными операторами: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator