Tengo un fragmento de código como el siguiente
let arr1 = [{status : true , name : "one"} , {status : false , name : "two"} , {status : true , name : "three"}] let arr2 = arr1.slice(); for(let i=0; i<arr2.length ; i++){ if(!arr2[i].status){ arr2[i].status = true; } } console.log("arr1....." , arr1); console.log("arr2......",arr2)En este caso se modifican tanto arr1 como arr2. Mi resultado esperado es solo actualizar arr2 y no arr1 (solo usando un bucle for simple)
¿Cómo puedo conseguir esto?
Los objetos dentro de las matrices apuntan a las mismas referencias, por lo que si actualiza un objeto en arr2 , actualizará el mismo objeto en arr1 . Así que tienes 2 opciones,
arr1 mientras asigna arr2 (copia profunda significa copiar incluso objetos dentro, puede funcionar más lento) let arr1 = [{status : true , name : "one"} , {status : false , name : "two"} , {status : true , name : "three"}] let arr2 = JSON.parse(JSON.stringify(arr1)); for(let i=0; i<arr2.length ; i++){ if(!arr2[i].status){ arr2[i].status = !arr2[i].status; } } console.log("arr1....." , arr1); console.log("arr2......",arr2)2. Copie el objeto (que le gustaría cambiar), agregue el campo modificado como se muestra a continuación
let arr1 = [{status : true , name : "one"} , {status : false , name : "two"} , {status : true , name : "three"}] let arr2 = [...arr1]; for(let i=0; i<arr2.length ; i++){ if(!arr2[i].status){ arr2[i] = {...arr2[i], status:!arr2[i].status}; } } console.log("arr1....." , arr1); console.log("arr2......",arr2)¿Qué tal cambiar una forma de copiar la matriz?
Para explicar por qué slice() hará que ambos se actualicen, es porque array.slice() también copia la referencia de la matriz original .
Entonces, cada vez que cambiaba la matriz original, la matriz copiada también cambiaba
let arr1 = [{status : true , name : "one"} , {status : false , name : "two"} , {status : true , name : "three"}] const arr2 = JSON.parse(JSON.stringify(arr1)); for(let i=0; i<arr2.length ; i++){ if(!arr2[i].status){ arr2[i].status = true; } } console.log("arr1....." , arr1); console.log("arr2......",arr2)Está creando una nueva matriz, pero los objetos que contiene siguen haciendo referencia a los originales. Debe crear nuevas referencias para estos objetos. Use lo siguiente en lugar de let arr2 = arr1.slice(); Este sería el enfoque de "Copia profunda" que mencionó @Tuba Polat.
let arr2 = arr1.map(oldObj => { return { ...oldObj } })