Estoy tratando de configurar un objeto json con setState, que agrega un nuevo par de valores clave con cada ciclo for.
Eventualmente, el objeto se verá así.
const data = [ { accuracy: 5, timeTaken: .8 }, { accuracy: -120, timeTaken: .5 }, { accuracy: -170, timeTaken: .5 }, { accuracy: 140, timeTaken: .6}, { accuracy: 150, timeTaken: .7 }, { accuracy: 110, timeTaken: .1}, ];La función actual se parece un poco a esto.,
if (overall !=null) { // var percentageCorrect = (100*(LevStein(results[3].question,results[3].answer)/results[3].question.length)) const [TestData, setTestData] = useState({}) for (var l = 0; l < overall.length; l++) { var results = JSON.parse(overall[l].testdetails.result) for (var i = 0; i < results.length; i++) { // setTestData({...x:(100*(LevStein(results[i].question,results[i].answer)/results[i].question.length)),}) console.log("accuracy: ",(100*(LevStein(results[i].question,results[i].answer)/results[i].question.length))," timeTaken: ",results[i].timeTaken) } } // JSON.parse(overall[0].testdetails.result); }¿Cómo agrego un nuevo valor a TestData para replicar el objeto json anterior?
El gancho useState no se puede llamar condicionalmente, esto rompe las reglas de los ganchos . Debe llamarse en el cuerpo del componente de la función.
Dado que results son una matriz, puede reemplazarlos o agregarlos al estado testData (* que debería ser una matriz, por cierto). Use una actualización de estado funcional para copiar superficialmente el estado anterior y asigne la matriz de results a los valores de objeto que desee.
const [TestData, setTestData] = useState([]); ... ... if (overall !== null) { overall.forEach(({ testdetails }) => { const results = JSON.parse(testdetails.result); setTestData(data => [ ...data, ...results.map(({ answer, question, timeTaken }) => ({ accuracy: 100 * (LevStein(question, answer) / question.length), timeTaken })) ]); }); }Puede agregar el objeto de esta manera:
setTestData([...testData, { new object }])