Si tengo una matriz nula y quiero hacer un bucle de un objeto sobre cada entrada, pero no funciona en los bucles de funciones. Ejemplo:
const myArray = [null, null, null] myArray.forEach(e => e = {}); // a console.log reveals that the loop is running 3 times console.log(myArray); // expected: [{}, {}, {}] reality: [null, null, null] for(let e of myArray) { e = {}; // a console.log reveals that the loop is running 3 times } console.log(myArray); // expected: [{}, {}, {}] reality: [null, null, null]clásico para obras:
for(let i = 0; i < myArray.length; i++) { myArray[i] = {}; } console.log(myArray); // expected: [{}, {}, {}] reality: [{}, {}, {}]¿Paso por alto algo obvio?
Fundamentalmente, cuando haces:
let e = myArray[someIndex]; ... está copiando el valor de myArray[someIndex] a e . No hay un vínculo continuo en ese punto entre e y el elemento de la matriz, es solo que tienen el mismo valor. Tanto forEach como for-of , de diferentes maneras, están haciendo fundamentalmente lo anterior. Asignar a e , en cualquier caso, no tendrá ningún efecto en el elemento de la matriz de donde proviene el valor de e . Es exactamente como:
let a = 1; let b = a; // This does not create any kind of link back to `a`... let b = 42; // So this doesn't change `a`.Si desea reemplazar todos los elementos de una matriz:
Si desea actualizar la matriz en su lugar, use un bucle for clásico como el que tiene en su pregunta, o algo similar que le proporcione un índice, y use ese índice para escribir en myArray[index] .
o
Para crear una nueva matriz de los valores actualizados, use map :
const newArray = myArray.map((e) => /*....*/);Cuando recorre la matriz, está pasando el valor a la devolución de llamada. Los valores primitivos se transfieren por valor y no por referencia, por lo que debe acceder al valor mediante un índice o simplemente puede asignar la matriz a una nueva
let myArray = [null, null, null] myArray = myArray.map(e => e = {}); console.log(myArray); const myArray2 = [null, null, null] myArray2.forEach((e, i) => myArray2[i] = {}); console.log(myArray2);ejemplo de trabajo: https://jsfiddle.net/5vpxeozs/