I have an api for surveys, the answers are optional and free. I keep the free responses in an array, and the optional ones in another, and then one.
But the problem is that if the user changes the answer, it will continue to be saved in the array, duplicating the question.
What I need is that when saving the answer in the array it compares if that question id already exists and deletes the previous one and adds the new one.
I have tried something like this but it deletes the new answer, not the previous one: Example, idQuestion is 28 in both but it must eliminate the first one it finds, that is, object 1, even if idRelacion is different:
1: Object
idRelacion: 1212
idPregunta: 28
2: Object
idRelacion: 1111
idPregunta: 28
import React, { useState } from "react";
import ReactDOM from "react-dom";
export default function App() {
var respuestas = [];
const preguntas = [
{
idEncuesta: 7,
encuesta: "Encuesta2 ",
idPregunta: 26,
pregunta: "¿Que tan probable es que le recomiende su jefe/a a un colega?",
listaRes: [
{
idRelacion: 11,
idPregunta: 27,
idRespuesta: 1,
respuesta: "Muy probable"
},
{
idRelacion: 22,
idPregunta: 27,
idRespuesta: 2,
respuesta: "Nada probable"
}
]
},
{
idEncuesta: 7,
encuesta: "Encuesta2",
idPregunta: 27,
pregunta:
"¿Qué tan fácil es obtener ayuda de su jefe/a cuando la necesita?",
listaRes: [
{
idRelacion: 158,
idPregunta: 130,
idRespuesta: 76,
respuesta: "Texto libre"
}
]
},
{
idEncuesta: 7,
encuesta: "Encuesta2",
idPregunta: 28,
pregunta: "¿Qué tan disponible para los empleados esta su jefe?",
listaRes: [
{
idRelacion: 88,
idPregunta: 28,
idRespuesta: 8,
respuesta: "Nada disponible"
},
{
idRelacion: 99,
idPregunta: 28,
idRespuesta: 9,
respuesta: "Poco disponible"
},
{
idRelacion: 1010,
idPregunta: 28,
idRespuesta: 10,
respuesta: "Moderadamente disponible"
},
{
idRelacion: 1111,
idPregunta: 28,
idRespuesta: 11,
respuesta: "Muy disponible"
},
{
idRelacion: 1212,
idPregunta: 28,
idRespuesta: 12,
respuesta: "Extremadamente disponible"
}
]
}
];
var [arrayPreguntas, setarrayPreguntas] = useState([]);
const [respuestaIdRelacion, setRespuestaIdRelacion] = useState([]);
var [arrayIdRelacion, setArrayIdRelacion] = useState([]);
const [respuestaLibre, setRespuestaLibre] = useState([]);
var [arrayRespuestaLibre, setArrayRespuestaLibre] = useState([]);
const handleChange = (e) => {
const { name, value } = e.target;
setRespuestaIdRelacion((prevState) => ({
...prevState,
idRelacion: parseInt(value),
idPregunta: parseInt(name)
}));
};
const onblurRespuesta = function () {
arrayRespuestaLibre.push(respuestaLibre);
};
const onblurIdRelacion = function (e) {
arrayPreguntas.push(respuestaIdRelacion);
console.log(arrayPreguntas);
arrayPreguntas = arrayPreguntas.filter(
(thing, index, self) =>
index === self.findIndex((t) => t && t.idPregunta === thing.idPregunta)
);
console.log(arrayPreguntas);
};
const guardar = (e) => {
e.preventDefault();
for (var i = 0; i < arrayPreguntas.length; i++) {
arrayIdRelacion.push(arrayPreguntas[i].idRelacion);
console.log(arrayIdRelacion);
}
if (arrayIdRelacion.length === 0) {
return;
}
for (var j = 0; j < arrayIdRelacion.length; ++j) {
respuestas.push({
idRelacion: arrayIdRelacion[j],
respuestaLibre: arrayRespuestaLibre[j]
});
}
console.log(respuestas);
//guardarRespuestas();
respuestas = [];
};
return (
<section style={{ display: "flex", justifyContent: "space-around" }}>
<div>
<form onSubmit={guardar}>
<ol>
{preguntas.map((item) => (
<li key={item.id}>
{item.pregunta}
<ul className="list-group">
{item.listaRes.map((subitem) => (
<React.Fragment>
<li
name="opciones"
className="list-group"
key={subitem.idRelacion}
>
<>
<input
className="form-check-input"
type="radio"
name={subitem.idPregunta}
defaultValue={subitem.idRelacion}
/* onChange={(e) =>
setRespuestaIdRelacion(e.target.value)
} */
onChange={handleChange}
onBlur={onblurIdRelacion}
></input>
<label
className="form-check-label"
htmlFor="exampleRadios1"
>
{subitem.respuesta}
</label>
</>
</li>
</React.Fragment>
))}
Obs.
<br />
<textarea
className="form-control mb-2"
type="text"
required
name="respuestaLibre"
autoComplete="off"
onChange={(e) => setRespuestaLibre(e.target.value)}
onBlur={onblurRespuesta}
></textarea>
</ul>
</li>
))}
</ol>
<button
className="btn btn-primary btn-sm active float-right btn-block"
type="submit"
>
Guardar
</button>
</form>
</div>
</section>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
You should not do a push you should play with the states if you want to modify a state you must use the function that sets it not to use the push directly in the state.
I modified the onBLurIdrelacion function, the rest is the same