Estoy tratando de iterar sobre un objeto que tiene muchos objetos más pequeños dentro. Quiero insertar condicionalmente un par de valores clave en cada uno de esos objetos más pequeños, por ejemplo:
const answers = { "question1": { answer: "Poor", metric: "focus" }, "question2": { answer: {agree: "yes", duration: "10"} metric: "exercise" } }Entonces, digamos que la respuesta en la pregunta 1 puede ser mala, buena o excelente, siendo mala una puntuación de 1, buena una puntuación de 5 y excelente una puntuación de 10. Dependiendo de la respuesta en la pregunta 1, me gustaría agregar una clave. par de valores como puntaje: 1 en el objeto question1
Luego, para la pregunta 2, observamos la duración y una duración de 10 nos da una puntuación de 10, por lo que insertamos el par de valores clave como puntuación: 10
Entonces, al final, quiero devolver un objeto que se parezca a:
newAnswers = { "question1": { answer: "Poor", metric: "focus", score: 1 }, "question2": { answer: {agree: "yes", duration: "10"} metric: "exercise", score: 10 } }En este ejemplo, muestro solo dos preguntas para simplificar, pero en realidad podrían ser muchas, y la misma lógica se aplicará a todas las demás preguntas.
Gracias por adelantado
Básicamente, lo que necesitas es una lógica de bucle.
Algo como esto ayudará.
Lógica
answer en cada objeto"poor", "good", "excellent" .duration y asignarla a la partitura.violín de trabajo
const answers = { "question1": { answer: "Poor", metric: "focus" }, "question2": { answer: {agree: "yes", duration: "10"}, metric: "exercise" } }; Object.entries(answers).forEach((item) => { const answer = item[1].answer; switch (typeof answer) { case "string": console.log(answer); const answerOptions = ["poor", "good", "excellent"]; const scoreOptions = [1, 5, 10]; const index = answerOptions.indexOf(answer.toLowerCase()); if(index !== -1) { item[1].score = scoreOptions[index]; } break; case "object": if (answer.duration && !isNaN(answer.duration)) { item[1].score = +answer.duration; } break; } }); console.log(answers)Si entiendo su pregunta correctamente, la pregunta es cómo insertar un nuevo atributo para cada objeto JSON. Si es el caso, puede hacer lo siguiente.
answers["question1"]["score"] = 1;Descuidando la verificación condicional de su lógica (es decir, la declaración condicional), la iteración podría ser:
$.each(answers, (q) => { q["score"] = x; }