javascript: resultado inesperado dentro de un bucle anidado

CorePress2024-01-16  10

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)
}

En este bucle, console.log es verdadero pero debería imprimirse como falso cuando encuentra 0 en una matriz

3

nunca volverás a establecer la condición en falso, cuando encuentre el primer elemento que no sea 0, la condición siempre será verdadera, intenta volver a establecer la condición en falso antes de la declaración if

- Krzysztof Krzeszewski

19/03/2021 a las 11:35

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

- mplungjan

19 de marzo de 2021 a las 11:36

No funcionó señor codepen.io/ranjan-raj-shrestha/pen/gOLNQzr?editors=1111

- Ranjan Raj Shrestha

19 de marzo de 2021 a las 11:43

1

¡Aún estás probando sólo el último elemento! Todo lo anterior se sobrescribirá porque no lo cambiaste de la manera propuesta

- Turo

19 de marzo de 2021 a las 11:53

Qué debo hacer si quiero un resultado

- Ranjan Raj Shrestha

19 de marzo de 2021 a las 11:57



------------------------------------

Estás continuamente configurando la condición como verdadera, porque p.e. 0 !== 2 se evalúa como verdadero. Este es el caso para todos los elementos, excepto 0. 0 !== 0 que se evalúa como falso. Debes poner una marca else allí y establecer la condición en falso, luego salir para que no continúe y anular tu valor nuevamente estableciendo la condición en verdadero para las próximas iteraciones.

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;
}

Esta no es la mejor manera de hacerlo, claro está... Sólo te estoy proporcionando un ejemplo de por qué tu código funciona de la forma en que lo hace.



------------------------------------

Aquí tienes una versión simplificada, que puedes examinar para ver cómo funciona y que puedes usar como plantilla para una versión más complicada si lo deseas.

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--\n\n");
}

Editar: De su comentario, deduje que después de cada viaje a través del bucle externo, desea informar si algún valor en la matriz era cero. Si esto es lo que estás buscando, harías algo como esto:

    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");
    }

Y las matrices de JavaScript también proporcionan algunos métodos integrados útiles para este tipo de situaciones. Entonces, si quieres, simplemente puedes hacer:

        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");
        }

Consulta cada método y funciones de flecha en MDN para obtener más explicaciones.

3

Hice este bucle interno pero quiero el mismo resultado fuera del bucle interno. ¿Qué técnica debo seguir? Porque estoy trabajando en un proyecto pequeño donde necesito el resultado final del bucle interno y enviar la condición al bucle externo al finalizar. de cada iteración del bucle externo

- Ranjan Raj Shrestha

19/03/2021 a las 12:05

Puede simplemente registrar el valor de la condición cada vez que pasa por el bucle externo (en lugar de registrar el "fin del bucle externo"), pero tenga en cuenta que el valor siempre será verdadero en este punto, porque la condición se prueba para cada valor en el bucle interno (incluido el último valor, 7, que obviamente no es igual a cero).

- Gato

19/03/2021 a las 12:25

¿Estás intentando mantenerlo en falso si encuentra un cero en cualquier parte del bucle interno?

&norteguión; gato

19/03/2021 a las 12:33



------------------------------------

Ya hay buenas respuestas aquí. Permítanme presentarles de esta manera como una respuesta adicional.

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));

.incluye()
array.includes(<value>)
.includes() devuelve verdadero si un valor dado está en una matriz, falso en caso contrario. !test.includes(0) devuelve verdadero si 0 NO está en la prueba. falso si 0 ESTÁ en la prueba.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare