¿Por qué el código funciona cuando escribo myArray[i] y no cuando guardo myArray[i] en una variable?

CorePress2024-01-24  14

Quiero llenar una matriz vacía con el clásico juego de fizzbuzz (números del 1 al 100, cuando un número es divisible por 3 imprime 'Fizz, divisible por 5 imprime 'Buzz', divisible por 3 y 5 imprime 'Fizzbuzz' '). El problema es que cuando escribo código como en la primera parte del código a continuación, guardo mi matriz [i] en una variable más conveniente, mi declaración if-else if no funciona, solo se imprimen números normales; pero cuando uso array[i] en lugar de una variable, todo funciona bien, como puedes ver en la segunda parte del código, donde 'Fizz', 'Buzz', 'FizzBuzz' sobrescriben los números normales. Deberían ser lo mismo ¿verdad?

Primera parte del código con una variable en lugar de matriz[i]

var numberArray = [];
var number = 0

for (var i = 0; i < 100; i++) {
    number += 1;
    thisNumber = numberArray[i];
    numberArray.push(number);

    if (number %3 ==0 && number %5 ==0) {
        thisNumber = 'FizzBuzz';
    } else if ( number %3 ==0 ) {
        thisNumber = 'Fizz';
    } else if ( number %3 ==0 ) {
        thisNumber = 'Buzz';
    }
}

console.log(numberArray);

Segunda parte del código con una matriz[i] en lugar de una variable

var numberArray = [];
var number = 0

for (var i = 0; i < 100; i++) {
    number += 1;
    numberArray.push(number);

    if (number %3 ==0 && number %5 ==0) {
        numberArray[i] = 'FizzBuzz';
    } else if ( number %3 ==0 ) {
        numberArray[i] = 'Fizz';
    } else if ( number %3 ==0 ) {
        numberArray[i] = 'Buzz';
    }
}

console.log(numberArray);


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

Reasignar una variable, por sí sola, nunca tiene efectos secundarios (excepto en las situaciones más raras por las que no vale la pena preocuparse). Haciendo este Número = 'FizzBuzz'; no cambia nada sobre cómo se pudo haber utilizado este número en el pasado.

Empujar después de asignar a este número. También desea enviar este número, no el número.

También necesitas cambiar el % 3 final al % 5; actualmente estás probando el % 3 dos veces.

var numberArray = [];
for (var i = 0; i < 100; i++) {
  let thisNumber = i;
  if (i % 3 == 0 && i % 5 == 0) {
    thisNumber = 'FizzBuzz';
  } else if (i % 3 == 0) {
    thisNumber = 'Fizz';
  } else if (i % 5 == 0) {
    thisNumber = 'Buzz';
  }
  numberArray.push(thisNumber);
}

console.log(numberArray);

2

Lo intenté con tu código pero funciona con índices, eso no es lo que quiero, porque quiero trabajar con el contenido de ellos. Se debe a un error mío, ya que publiqué la pregunta al principio escribiendo thisNumber = I y no thisNumber =numberArray[i] como debería ser. Te pido disculpas, de todos modos edité correctamente la pregunta

- Alebacce

27/03/2021 a las 18:16

El código de mi respuesta no utiliza índices; mírelo de nuevo. El principal cambio en el registro.La idea de mi respuesta es que el número se inserta al final del ciclo, no al comienzo del ciclo. (Si presiona un número y luego reasigna la variable que apuntaba al número, la matriz no cambiará).

Cierto rendimiento

27/03/2021 a las 19:17



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

En JavaScript, una variable es solo una referencia a un objeto y una asignación cambia hacia donde apunta. En

thisNumber = 'FizzBuzz';

creas un nuevo objeto de cadena y haces referencia a él con este Número. En

numberArray[i] = 'FizzBuzz';

modificas el elemento i-ésimo de la matriz numberArray.

No puedes crear una referencia a un elemento de matriz y modificarla con una asignación. Eso esno es posible en JavaScript.

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