Неожиданный результат внутри вложенного цикла

#javascript #arrays #loops #for-loop #nested-loops

Вопрос:

 let conditon = false

const test = [2, 0, 3, 4, 5, 6, 7]
for (let i = 0; i < 10; i  ) {
  for (let j = 0; j < test.length; j  ) {
    if (0 !== test[j]) {
      conditon = true;
       break;
    }else{
      conditon = false;
      break;
    }
  }
  console.log(conditon)
} 

В этом цикле это консоль.регистрируйте значение true, но оно должно выводить значение false, когда оно находит 0 в массиве

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

1. вы никогда не возвращаете условию значение false, когда оно обнаруживает, что первое условие, отличное от 0, всегда будет истинным, попробуйте вернуть условию значение false перед оператором if

2. for (let j = 0; j < test.length; j ) { console.log(0 !== test[j]) }

3. не сработало сэр codepen.io/ranjan-raj-shrestha/pen/gOLNQzr?editors=1111

4. Вы все еще тестируете только последний элемент! Все, что было раньше, будет перезаписано, потому что вы не изменили это предложенным способом

5. Что нужно сделать, если я хочу получить результат

Ответ №1:

Вы постоянно устанавливаете condition значение true, потому что, например 0 !== 2 , значение равно true. Это относится ко всем элементам, кроме 0. 0 !== 0 значение которого равно false. Вам нужно поставить там отметку » еще «и установить condition значение «ложь», затем отключиться, чтобы оно не продолжалось, и снова переопределить ваше значение condition , установив значение «истина» для следующих итераций.

 let condition = false;

const test = [2, 0, 3, 4, 5, 6, 7]
for (let i = 0; i < 10; i  ) {
  for (let j = 0; j < test.length; j  ) {
    if (0 !== test[j]) {
      conditon = true;
    } else {
      conditon = false;
      break;
    }
  }

  console.log(conditon)

  // Comment this part out if you want it to continue looping without immediately stopping.
  // Otherwise the loop ends once it hits 0.
  if(!condition)
    break;
} 

Имейте в виду, что это не лучший способ сделать это… Я просто даю вам пример того, почему ваш код работает именно так.

Ответ №2:

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

 let condition;
const nums = [2, 0, 3, 4, 5, 6, 7];

for(let i = 0; i < 2; i  ){
  for (let num of nums) {
    condition = (num !== 0);
    console.log(num, condition);
  }
  console.log("n--end of outer loop--nn");
} 

Изменить:
Из вашего комментария я понял, что после каждого прохождения внешнего цикла вы хотите сообщать, было ли какое-либо значение в массиве равно нулю. Если это то, что вы ищете, вы бы сделали что-то вроде этого:

     const nums = [2, 0, 3, 4, 5, 6, 7];

    for(let i = 0; i < 2; i  ){
      let noZerosFound = true;
      console.log("checking: "   nums);
      for (let num of nums) {
        if(num === 0){
          noZerosFound = false;
          // Can include a `break` statement here for better performance
        }
      }
      console.log("noZerosFound: "   noZerosFound);
      console.log("n");
    } 

И массивы JavaScript также предоставляют некоторые полезные встроенные методы для такого рода ситуаций. Так что, если вы хотите, вы могли бы просто сделать:

         const nums = [2, 0, 3, 4, 5, 6, 7];

        for(let i = 0; i < 2; i  ){
          console.log("checking: "   nums);

          // Applies the function `(num) => num !== 0` to each element of `nums`. 
          //   If the result is true for every element, returns true.  
          //   Otherwise, returns false. 
          const noZerosFound = nums.every( (num) => num !== 0);

          console.log("noZerosFound: "   noZerosFound);
          console.log("n");
        } 

.every Дополнительные пояснения см. в разделе Функции метода и стрелок в MDN.

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

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

2. Вы можете просто регистрировать значение condition after каждый раз через внешний цикл (вместо регистрации «конца внешнего цикла») — но имейте в виду, что значение всегда будет true к этому моменту, потому что условие проверяется для каждого значения во внутреннем цикле (включая последнее значение 7 , которое, очевидно, не равно нулю).

3. Вы пытаетесь сохранить его на false том уровне, если он найдет ноль где-нибудь во внутреннем цикле?

Ответ №3:

Здесь уже есть хорошие ответы. Позвольте мне представить этот способ в качестве дополнительного ответа.

 const test = [2, 0, 3, 4, 5, 6, 7];
console.log(!test.includes(0));

const test2 = [2, 1, 3, 4, 5, 6, 7];
console.log(!test2.includes(0)); 

.включает в себя()

 array.includes(<value>)
 
  • .includes() возвращает true , если заданное значение находится в массиве, false если нет.
  • !test.includes(0) возвращается true , если 0 его НЕТ внутри test . false если 0 есть test .