Поэтому я запускаю оператор if/else, чтобы проверить, совпадает ли входное значение с названием фильма, но по какой-то причине, даже если заголовок и значение одинаковы и цикл должен остановиться, он все равно сохраняется. работает и выполняет инструкцию оператора else. Почему это?.
Вот как мой код выглядит на данный момент
import React from 'react'
import styles from '@/styles/movies.module.css'
import Image from 'next/image';
export default function index() {
const movies = [
{
title: 'Batman: the dark knight',
releaseDate: '27 April 2007',
rating: 9.8,
image: "/pic11.jpg"
},
{
title: 'Scrubs',
releaseDate: '18 April 2012',
rating: 4.7,
image: "/pic12.jpg"
},
{
title: 'Ted',
releaseDate: '16 April 2002',
rating: 9,
image: "/pic13.png"
},
{
title: 'Transformers',
releaseDate: '27 April 2007',
rating: 8,
image: "/pic14.jpg"
},
{
title: 'Batman: the dark knight rises',
releaseDate: '27 April 2007',
rating: 9.2,
image: "/pic15.jpg"
},
];
const func = (arg) => {
for(let i = 0; i < movies.length; i++){
if (arg === movies[i].title){
console.info(movies[i].title)
console.info(`The movie ${movies[i].title} has been found`)
} else {
console.info(`The movie ${arg} has not been found!`)
}
}
}
return (
<div className = {styles.fightContainer}>
<div className = {styles.topStuff}>
<h1>Movie Fight!</h1>
<input
type = "text"
placeholder='eg Batman....'
name='arg'
className = {styles.inputation}
onKeyUp = {(e) => func(e.target.value)}
/>
</div>
<div className = {styles.interactionContainer}>
{movies.map(movie => (
<div className = {styles.fightCard} key = {movie.rating}>
<div className = {styles.imageContainer}>
<Image src = {movie.image} width = {130} height = {100} className = {styles.image} alt = "img" />
</div>
<div className = {styles.textContainer}>
<p>{movie.title}</p>
<p>{movie.releaseDate}</p>
<p>{movie.rating}</p>
</div>
<button>More info</button>
</div>
))}
</div>
<h1>hey</h1>
</div>
)
}
Где я могу ошибиться?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы выполняете цикл for: пока вы не не прервете, он будет продолжать выполняться.
В вашем примере: если вы напишете «Скрабы», он правильно войдет в оператор if внутри второго цикла вашей функции, но цикл for не остановится, если вы его не сломаете (вот почему вы продолжаете видеть весь консольный журнал фильма не найдено).
Поэтому вы можете добавить разрыв внутри if, например:
const func = (arg) => {
for(let i = 0; i < movies.length; i++){
if (arg === movies[i].title){
console.info(movies[i].title)
console.info(`The movie ${movies[i].title} has been found`);
break;
} else {
console.info(`The movie ${arg} has not been found!`)
}
}
}
Интересно, что консоль по-прежнему регистрируется дважды даже после выполнения условия. Я поставил прерывание, но когда условие выполнено, оно все равно выполняет условие успеха дважды, хотя оператор else не выполняется.
Это происходит потому, что вы не разорвали/вышли из цикла после выполнения условия, вы можете использовать перерыв внутри условия, если
const func = (arg) => {
for(let i = 0; i < movies.length; i++){
if (arg === movies[i].title){
console.info('The movie ${movies[i].title} has been found');
break;
} else {
console.info('The movie ${arg} has not been found!');
}
}
}
Я поставил перерыв, но он продолжает выполнять его дважды
«даже если заголовок и значение одинаковы и цикл должен остановиться», вы никогда не останавливаете цикл. Таким образом, он продолжает зацикливаться, потому что вы никогда не говорили ему поступать иначе.