Tengo una matriz como esta:
a=[{id:1 , operand:2 ,children:[{a:1]{b:2}]Y hago esto cuando quiero agregar un nuevo campo:
const [items, setItems] = useState(a); const gettableData = (value) => { let operanList = items; let repeatListError = tableData.filter((i) => i.operandId === value.operandId); if (!repeatListError.length > 0) operanList.push(value); setTableData(operanList); };Este método se llama cada vez que hago clic en un botón. Quiero verificar el operando cuando agrego un nuevo objeto, si solo hay una actualización de children.like:
value=[{id:1 , operand:2 ,children:[{a:1]{b:2}{c:3}{d:4}]Primero vuelva a formatear el valor como el siguiente. Lo que tiene es incorrecto en la sintaxis:
const value=[{id:1 , operand:2 ,children:{a:1,b:2,c:3,d:4}}]Así puedes cambiar los niños dentro de los objetos que están en tu matriz:
const list = [ { id: 1, operand: 2, children: { a: 1, b: 2, c: 3, d: 4 } }, { id: 2, operand: 3, children: { a: 1, b: 2, c: 3, d: 4 } }, ]; let newList = [...list]; let updatedChildren = { ...newList[1].children, e: 5, f: 6 }; let updatedItem = { ...newList[1], children: updatedChildren }; newList.splice(1, 1, updatedItem); console.log(newList); setState(newList);creas una nueva instancia de la matriz. actualice el atributo de niños de su elemento deseado (en este caso, elegí 1). luego actualice todo el objeto que está en su matriz (contiene la identificación y el operando y los niños). y finalmente mutar la nueva lista reemplazando el elemento original por el nuevo. En el método de empalme, recuerde que el segundo número siempre debe ser uno, ya que eliminará un elemento y el primer número dado debe ser el índice del elemento que se necesita cambiar (en este caso, elegimos uno). luego puede continuar configurando el estado como desee ya que tiene una lista nueva y actualizada.
Veo algunas inconsistencias en los nombres de las variables utilizadas en su código, por ejemplo, ¿dónde está tableData ? ¿Son los items que forman parte del estado?
No entiendo si los niños son una matriz de objetos o simplemente un objeto con pares de valores clave.
De todos modos, como mencioné en mi comentario, la forma más fácil de lograr esto es usando el mapa. Considérelo como una implementación genérica e intente usarlo en su código.
const a=[{id:1 , operand:2 ,children:[{a:1]{b:2}] // What is the data stucture of children? Is it array of objects or just object? const [items, setItems] = useState(a); const gettableData = (value) => { // creating a copy is not required as map will return a new array. // map => filter + modify, so use map let updatedList = tableData.map((i) => { if (i.operandId === value.operandId) { // match found, so update children return { ...i, // first, copy everything from i children: [ // then update children, and since children is an array of objects ...i.children, // first copy every key of i's children ...value.children // then copy value's children ] } } return i; // no match? return i as it is. }); setItems(updatedItems)Tienes que poner la matriz en otra variable y decirle que si tiene hijos, la recordará en el campo de hijos y le establecerá un nuevo valor.