Tengo una estructura de datos como esta:
const data = [ { question: 'string of question', parentId: '1', userChoice: 'Yes', child: [] }, { question: 'string of question', parentId: '2', userChoice: 'No', child: [ { id: 6, sub_question: 'sub question', weightage: 1 }, { id: 7, sub_question: 'sub question', weightage: 1 }, { id: 8, sub_question: 'sub question', weightage: 1 } ] } ]Puedo manejar la primera capa de datos sin una matriz secundaria.
Así es como lo estoy haciendo;
// states const deviceReport = localStorage.getItem('deviceReport') ? JSON.parse(localStorage.getItem('deviceReport')) : [] const [data, setData] = useState(deviceReport) const [childData, setChildData] = useState([]) // To Put user response via question param to data and then persist it with localStorage const handleClickYes = (question) => { // find if question is in the data array const hasQuestion = data.find(({ parentId }) => question.id === parentId) const indexOfQuestion = data.indexOf(hasQuestion) // copy data to mutable object let newData = [...data] if (hasQuestion) { // update the value with specific selected index in the array. newData[indexOfQuestion] = { question: question.if_yes, parentId: question.id, userChoice: 'YES', child: [] } } else { // concat existing data with a new question newData = [ ...newData, { question: question.if_yes, parentId: question.id, userChoice: 'YES', child: [] } ] } localStorage.setItem('deviceReport', JSON.stringify(newData)) setData(newData) } De manera similar, ahora quiero agregar los datos a la matriz child con una lógica similar, como si la matriz secundaria tiene la misma clave, entonces no debería concatenar; de lo contrario, debería concatenar la matriz secundaria
Intenté seguir este método para construir childData primero y luego concatenar en data.child[] Pero esto no funciona ni siquiera para recopilar la respuesta del usuario
function subQuestionsHandler(sub) { // const hasId = data.child.some(({ id }) => sub.id === id) const id = sub.id const sub_question = sub.sub_question const weightage = sub.weightage // console.log(id, sub_question, weightage) const hasId = childData.find(({ id }) => sub.id === id) if (!hasId) { setChildData((childData) => childData.concat({ id: id, sub_question: sub_question, weightage: weightage })) } }Entonces, ¿cómo puedo concatenar la matriz secundaria dentro de la matriz de datos? ?
Formación:
let data = [ { id: 1, question: "...", children: [], }, { id: 2, question: "...", children: [ { id: 1, sub_question: "...", }, { id: 2, sub_question: "...", }, ], }, ];Matriz concatenada:
data = [...data]; data.push({ id: 3, question: "concatenated", children: [], });Actualizar matriz:
const datumIndexToUpdate = 0; data = [...data]; data[datumIndexToUpdate] = { ...data[datumIndexToUpdate] }; data[datumIndexToUpdate].question = "updated";Sub-arreglo Concat:
const datumIndexToUpdate = 0; data = [...data]; data[datumIndexToUpdate] = { ...data[datumIndexToUpdate] }; data[datumIndexToUpdate].children = [...data[datumIndexToUpdate].children]; data[datumIndexToUpdate].children.push({ id: 3, sub_question: "concatenated", });Subarreglo de actualización:
const datumIndexToUpdate = 0; const childIndexToUpdate = 0; data = [...data]; data[datumIndexToUpdate] = { ...data[datumIndexToUpdate] }; data[datumIndexToUpdate].children = [...data[datumIndexToUpdate].children]; data[datumIndexToUpdate].children[childIndexToUpdate] = { ...data[datumIndexToUpdate].children[childIndexToUpdate], }; data[datumIndexToUpdate].children[childIndexToUpdate].sub_question = "updated";Así es como se concatena una matriz
[1].concat([3]) === [1, 3]Así es como se concatena una matriz anidada
const nest1 = [[1]] const nest3 = [[3]] nest3[0].concat(nest1[0]) // === [[3, 1]]Ahora sugiero simplificar su escenario y aplicarle esta lógica. O cambia el título de tu pregunta.