Uso un objeto de matrices y quiero eliminar un valor específico en 1 de las matrices.
let medici= ["Person1","Person2", "Person3", "Person4", "Person5", "Person6" ]; let giorni = ["Lun", "Mar", "Mer","Gio","Ven"]; let presenti ={}; for (let giorno of giorni){ presenti[giorno] = medici; }Yo obtengo:
Gio: ["Person1", "Person2", "Person3", "Person4", "Person5", "Person6"], Lun: ["Person1", "Person2", "Person3", "Person4", "Person5", "Person6"], Mar: ["Person1", "Person2", "Person3", "Person4", "Person5", "Person6"], Mer: ["Person1", "Person2", "Person3", "Person4", "Person5", "Person6"], Ven: ["Person1", "Person2", "Person3", "Person4", "Person5", "Person6"]Ahora quiero eliminar un valor específico en una matriz específica:
giorno="Ven"; nome="Person1"; presenti[giorno].splice(presenti[giorno].indexOf(nome), 1);¡Elimina el valor en todas las matrices! No solo en el "Ven" ... ¿Cómo puedo eliminar un solo elemento en una matriz específica que no afecte a las otras matrices del objeto?
Gracias
const medici = ["Person1","Person2", "Person3", "Person4", "Person5", "Person6" ]; const gironi = ["Lun", "Mar", "Mer","Gio","Ven"]; const presenti = {}; for (const giorno of gironi) { presenti[giorno] = [...medici]; } presenti["Ven"].splice(presenti["Ven"].indexOf("Person1"), 1); console.log(presenti); Su problema tiene que ver con la referencia de memoria, cuando iguala dos variables, no está creando otro objeto idéntico, sino copiando la referencia del objeto de una variable a otra, por lo que si modifica X , cambia Y , para corregir puede crear otro Array usando el operador de propagación [...medici]
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
Cuando construye su objeto, todas las matrices tienen la misma referencia, por lo que deberá slice los medici en cada valor de objeto. Eche un vistazo a Copiar matriz por valor
Ahora puedes usar el método.
let medici= ["Person1","Person2", "Person3", "Person4", "Person5", "Person6" ]; let giorni = ["Lun", "Mar", "Mer","Gio","Ven"]; let presenti ={}; for (let giorno of giorni){ presenti[giorno] = medici.slice(); } let giorno="Ven"; let nome="Person1"; presenti[giorno].splice(presenti[giorno].indexOf(nome), 1); console.log(presenti) let medici= ["Person1","Person2", "Person3", "Person4", "Person5", "Person6" ]; let giorni = ["Lun", "Mar", "Mer","Gio","Ven"]; let presenti ={}; for (let giorno of giorni){ presenti[giorno] = medici; } giorno="Ven"; nome="Person1"; const filteredData = presenti[giorno].filter((p)=>p!==nome) presenti[giorno] = filteredData console.log(presenti) Lo hace porque en JavaScript Array y Objects se conocen como tipos de referencia. [Aprende más aquí]. 1
Para solucionar tu problema puedes hacer esto:
giorno="Ven";
nome="Person1";
Al principio, filtre Person1 de la matriz. const filteredData = presenti[giorno].filter((p)=>p!==nome)
Luego reemplace el objeto Ven con los datos filteredData actualizados
presenti[giorno] = filteredData