Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

224
Vistas
Cómo cambiar useState para una matriz anidada de objetos

tengo un estado:

 const obj = [{id: "1", obj_of_names: [{ id: "a1", name: "abc", school: "xyz" }, { id:"b1", name: "def", school: "zyx" }, { id:"c1", name: "ghi", school: "pqr" }] }, {id: "2", obj_of_names: [{ id: "d1", name: "abc123", school: "xyz123" }] }] const [newobj, setObj] = useState("obj")

Ahora quiero actualizar la escuela para el id:d1 dentro del id:2. Supongamos que el valor anterior es la escuela: xyz123 ahora quiero actualizarlo a la escuela: newxyz123. ¿Cómo puedo lograr esto usando el operador de propagación o por otro método?

Probé el siguiente código:

 setObj((prevObjects) => { const tempIndex = prevObjects.findIndex( (item) => item.id === reqdImgID ); const newObject = obj[tempIndex].obj_of_names.map((obj) => { if (obj.id == reqdID) { return { ...obj, school: newSchool,};} return obj; }););

Pero obtengo esto como salida: {id:"c1", nombre: "ghi", escuela: "newxyz123"}

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Sugiero crear una función que reciba la matriz original, una función de comparación y una función de reemplazo. El propósito de esta función es devolver una nueva matriz con el valor cambiado.

 function mutateObject(array, matcher, replacer) { // returns a new array, with all elements untouched, except for those that match the matcher function, which are replaced with new objects created by the replacer function return array.map(function (item) { return matcher(item) ? {...replacer(item)} : item; }); }

Luego, use la función para reemplazar los valores.

 mutateObject(obj, group => group.id == "2", group => { const newNames = mutateObject(group.obj_of_names, name => name.id === "d1", name => ({ ...name, school: "newxyz123" })); return { ...group, obj_of_names: newNames } });

Qué hará esto:

  1. Usando la matriz original, encuentre el objeto donde la identificación (en el objeto raíz) es "2".
  2. Aplique la función de reemplazo, que:
    1. Use obj_of_names para encontrar el objeto donde la identificación es "d1".
    2. Aplique la función de reemplazo para devolver un nuevo objeto con el nuevo valor de la escuela, utilizando el operador de extensión.
    3. Devuelve un nuevo objeto clonado por el operador de propagación con el objeto obj_of_names reemplazado, que contiene el valor de la escuela reemplazada.

Por supuesto, puede mejorar este código y su legibilidad mediante el uso de varias bibliotecas para clonar los objetos, mutarlos y devolver nuevos objetos, pero es una solución si desea comenzar. Además, si desea cambiar el nombre de la escuela, sugiero usar la respuesta a la que se hace referencia @aweimon, pero si desea cambiar varios objetos según varios criterios, puede mejorar la función anterior.

 const obj = [{ id: "1", obj_of_names: [{ id: "a1", name: "abc", school: "xyz" }, { id: "b1", name: "def", school: "zyx" }, { id: "c1", name: "ghi", school: "pqr" } ] }, { id: "2", obj_of_names: [{ id: "d1", name: "abc123", school: "xyz123" }] } ] function mutateObject(array, matcher, replacer) { // returns a new array, with all elements untouched, except for those that match the matcher function, which are replaced with new objects created by the replacer function return array.map(function(item) { return matcher(item) ? { ...replacer(item) } : item; }); } const updatedObj = mutateObject(obj, group => group.id == "2", group => { const newNames = mutateObject(group.obj_of_names, name => name.id === "d1", name => ({ ...name, school: "newxyz123" })); return { ...group, obj_of_names: newNames } }); console.log(updatedObj);

about 4 years ago · Juan Pablo Isaza Denunciar

0

const arr = [{id: "1", obj_of_names: [{ id: "a1", name: "abc", school: "xyz" }, { id:"b1", name: "def", school: "zyx" }, { id:"c1", name: "ghi", school: "pqr" }] }, {id: "2", obj_of_names: [{ id: "d1", name: "abc123", school: "xyz123" }] }]

Puede llamar a un mapa dentro de otro mapa y cambiar la matriz dentro del objeto de esta manera:

 const newArr = arr.map((item)=>{ if(item.id == 2){ return {...item, obj_of_names: item.obj_of_names.map((item2)=>{ if(item2.id === 'd1'){ return {...item2, school: 'newxyz123'} } return item2 }) } } return item }) const [state, setState] = useState(arr)

Luego puede llamar a setState y actualizarlo con newArr

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda