Necesito una explicación para algo extraño que noté con el corte de matriz (NodeJs)
const a = [{ x: 1 }, { x: 3 }, { x: 4 }]; const b = a.slice(0, 2); for (let input of b) { input.y = 1; } console.log(b); console.log(a);La salida tiene la matriz a y la matriz b actualizadas, aunque en el ciclo for, solo estoy actualizando los elementos en la matriz b. ¿Que me estoy perdiendo aqui?
Editar: Intenté buscar esto y revisé MDN Docs para 'segmentar' pero desafortunadamente no pude encontrar nada.
Según el documento
El método slice() devuelve una copia superficial de una parte de una matriz en un nuevo objeto de matriz seleccionado de principio a fin
Básicamente, crea una nueva matriz, pero los elementos seleccionados seguirán siendo los mismos, aquí están las mismas referencias de los objetos.
Podrías comprobarlo así comparando
const a = [{ x: 1 }, { x: 3 }, { x: 4 }]; const b = a.slice(0, 2); console.log(a[0] === b[0]) console.log(a[1] === b[1])Array.slice crea una copia de la matriz, por lo que a !== b , pero dado que a está hecho de objetos, b aún conserva las referencias a esos objetos idénticos. Por lo tanto, cualquier cambio que realice en los objetos de una matriz también afectará a la otra matriz.
Tienes que hacer una copia profunda de a si quieres que b contenga objetos completamente nuevos.
cuando usa el segmento, obtendrá una nueva matriz, pero los objects son los mismos que están en a . Si desea agregar propiedades sin afectar el objeto en a entonces debe clonar los objetos.
Recuerde: el fragmento de código siguiente funcionará si no hay objetos anidados
const a = [{ x: 1 }, { x: 3 }, { x: 4 }]; const temp = a.slice(0, 2); const b = []; for (let obj of temp) { const o = { ...obj }; oy = 1; b.push(o); } console.log(a); console.log(b);