Tengo el siguiente código que ejecuto en la consola:
// cache the starting array - 50 elements let asTheyWere = selDocument.fields.field; // create the new object let nf = {}; $j.each(selDocument.fields.field[selDocument.fields.field.length - 1], function(a, b){ nf[a] = b; }); // make a change and add the object to the array for(i = 0; i < 5; i++) { nf.name = `test me ${i}`; // console.log(nf.name) shows 'test me 0', 'test me 1' ... 'test me 4' selDocument.fields.field.push(nf); } // assign the array to a new variable - now at 55 elements let asTheyAre = selDocument.fields.field; // check the values console.log(asTheyWere); console.log(asTheyAre);Sé que la consola no se actualiza hasta que finaliza el código, por lo que todas las variables se registran con su valor final. Pensé que usar diferentes variables evitaría eso, pero as TheyWere y as TheyAre son lo mismo, mostrando 55 elementos (el primero debería tener 50), Y los valores agregados al final de la matriz también son iguales: deberían ser 'Pruébame 0', 'Pruébame 1', 'Pruébame 2' y así sucesivamente, pero todos son 'Pruébame 4'.
Cuando todo esté hecho, luego correr
> console.log(selDocument.fields.field)muestra 'pruébame 4' en todos los elementos agregados, por lo que no es solo el registro.
¿Que esta pasando? ¿Cómo puedo ver el progreso y ver valores precisos, y obtener los valores correctos agregados a la matriz?
Aunque son variables diferentes, siguen apuntando al mismo valor. Por ejemplo:
const foo = ['hello'] const bar = foo foo[0] = 'goodbye' console.log(bar[0]) // prints "goodbye"! Esto sucede porque cuando asignas bar = foo , en realidad no estás creando una copia de foo. En cambio, está diciendo que esta bar de variables es solo otro nombre que se usa para referirse al contenido de foo .
Podría intentar clonar el objeto original para compararlo con el nuevo. Si el objeto se compone de datos simples, puede clonarlo así:
const asTheyWere = JSON.parse(JSON.stringify(selDocument.fields.field)); // Make your changes... const asTheyAre = selDocument.fields.field; console.log(asTheyWere); console.log(asTheyAre);