Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

139
Views
Modificación no deseada en variable de Estado (Hook), por manipulación de variable local
import React, { useState, useEffect } from "react"; export const Test = () => { const [data, setData] = useState([]); const file = [{ id: 1, description: "Test Data" }]; useEffect(() => setData(file), []); const manipulateData = (data) => { let tempArray = [...data]; tempArray.map((item) => delete item.id); }; return ( <> <h1>Testing Data</h1> {manipulateData(data)} {console.log(data)} </> ); };

Quiero modificar la variable local " tempArray ", y los cambios no se reflejarán en la variable " data "

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Su camino es correcto en caso de que no esté usando una matriz multidimensional, pero aquí está clonando una matriz multidimensional, y al usar el operador =, ¡asignará objetos/matrices por referencia en lugar de por valor! Eso significa que cada vez que modifique cualquiera de los dos objetos, afectará el valor de ambos.

Una buena manera de resolver esto es creando un clon profundo haciendo algo como esto

 const tempArray = JSON.parse(JSON.stringify([...data])) tempArray.map((item) => delete item.id)
about 4 years ago · Juan Pablo Isaza Report

0

Esto sucede porque está creando una nueva matriz, pero los objects de esa matriz no se copian profundamente. En cambio, representan solo una referencia a los mismos objetos que en los datos.

Debido a que ambas referencias apuntan al mismo objeto, si elimina una propiedad de objeto de los objetos tempArray , en realidad la está eliminando de los objetos de data .

Si desea resolver esto, debe destruir la referencia haciendo una copia profunda de los objetos de la matriz de data .

Aquí hay un ejemplo de cómo hacerlo:

 export const Test = () => { const [data, setData] = useState([{ id: 1, description: "Test Data" }]); const manipulateData = (data) => { let tempArray = data.map((item) => {item.description}); //this will create an array with new object, and destroy the reference to the objects of data. }; return ( <> <h1>Testing Data</h1> {manipulateData(data)} {console.log(data)} </> ); };

Además, en lugar de eliminar una propiedad, es mejor elegir la que necesita.

about 4 years ago · Juan Pablo Isaza Report

0

El siguiente código:

 let tempArray = [...data];

solo copia superficialmente su matriz data , lo que significa que cualquiera de los objetos dentro de tempArray se refiere a los mismos objetos en la memoria que están dentro de la matriz data . Esto significa que cuando recorre sus objetos con .map() , cada item también se refiere a un objeto de data , lo que da como resultado que los objetos en data cambien cuando usa delete item.id .

Actualmente, está utilizando .map() solo para recorrer su tempArray , este no es el propósito de .map() . El método .map() devuelve una nueva matriz, y la función de devolución de llamada que le pasa debería devolver un nuevo valor al que desea asignar el valor actual. Esto significa que puede usar .map() para crear tempArray , haciendo que la función de devolución de llamada devuelva un nuevo objeto que excluya la propiedad id :

 const manipulateData = (data) => { const tempArray = data.map(({id, ...rest}) => rest); // ... do what you need with `tempArray` ... };

Arriba, {id, ...rest} está desestructurando la sintaxis de asignación , que extrae la propiedad id del elemento actual y almacena todas las demás propiedades/valores del objeto actual en rest . Esto le permite crear un nuevo objeto que excluye la propiedad id .

Como nota al margen, no debe llamar a métodos como console.log() y manipulateData() dentro de JSX si no devuelven nada significativo que se mostrará en la pantalla; en su lugar, puede colocarlos en un gancho useEffect() .

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!