Javascript React对象和数组

Javascript React对象和数组,javascript,arrays,json,reactjs,object,Javascript,Arrays,Json,Reactjs,Object,我试图根据json中提供的正确答案来匹配单击时的答案,但是因为我运行了一个map函数来返回数据,尽管我能够从对象中获取clicked button的值,但无法将其与正确答案与单击的答案相匹配 下面是我的代码 测验 import React, { useState } from "react"; import quizData from "../data/quizData.json"; export default function Quiz() {

我试图根据json中提供的正确答案来匹配单击时的答案,但是因为我运行了一个map函数来返回数据,尽管我能够从对象中获取clicked button的值,但无法将其与正确答案与单击的答案相匹配

下面是我的代码

测验

import React, { useState } from "react";
import quizData from "../data/quizData.json";

export default function Quiz() {
  const [value, setValue] = useState(quizData);

  function handleClick(e) {
    let answer = value.quiz_questions[0].answer;
    if (answer === e.target.value) {
      alert("Correct Answer");
    } else {
      alert("Please choose the correct answer");
    }
    console.log(e.target.value);
    console.log(answer);
  }

  return (
    <div>
      {value.quiz_questions.map((quiz) => {
        return (
          <div key={quiz.id}>
            <p>{quiz.instruction_text}</p>
            {quiz.answer_options.map((btn, index) => {
              return (
                <button key={index} onClick={handleClick} value={btn}>
                  {btn}
                </button>
              );
            })}
          </div>
        );
      })}
    </div>
  );
}
上面的代码适用于第一个问题,因为我正在硬编码数组中第一个对象的答案,
我们是否有可能在数组中循环并使用单击的答案进行设置?

您需要找到第一个对象:

let answer = value.quiz_questions.find((data) => data.id == id)?.answer;

完整的handleClick功能逻辑:

function handleClick(btnValue, id) {
    let answer = value.quiz_questions.find((data) => data.id == id).answer;
    if (answer === btnValue) {
      alert("Correct Answer");
    } else {
      alert("Please choose the correct answer");
    }
    console.log(answer);
  }

以下是完整的代码:

import React, { useState } from "react";
import "./styles.css";

const quizData = {
  quiz_questions: [
    {
      id: 1,
      instruction_text: "How many continents are there on Planet Earth?",
      answer_options: ["5", "6", "7", "8"],
      answer: "7"
    },
    {
      id: 2,
      instruction_text: "What's your favorite number?",
      answer_options: ["1", "2", "3", "4"],
      answer: "4"
    }
  ]
};
function Quiz() {
  const [value, setValue] = useState(quizData);

  function handleClick(btnValue, id) {
    let answer = value.quiz_questions.find((data) => data.id == id).answer;
    if (answer === btnValue) {
      alert("Correct Answer");
    } else {
      alert("Please choose the correct answer");
    }
    console.log(answer);
  }

  return (
    <div>
      {value.quiz_questions.map((quiz) => {
        return (
          <div key={quiz.id}>
            <p>{quiz.instruction_text}</p>
            {quiz.answer_options.map((btn, index) => {
              return (
                <button
                  key={index}
                  onClick={(e) => handleClick(btn, quiz.id)}
                  value={btn}
                >
                  {btn}
                </button>
              );
            })}
          </div>
        );
      })}
    </div>
  );
}

export default function App() {
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <Quiz />
    </div>
  );
}


import React,{useState}来自“React”;
导入“/styles.css”;
常数quizData={
问答题:[
{
id:1,
说明文字:“地球上有多少大陆?”,
回答选项:[“5”、“6”、“7”、“8”],
答复:“7”
},
{
id:2,
说明文字:“你最喜欢的号码是什么?”,
回答选项:[“1”、“2”、“3”、“4”],
答复:“4”
}
]
};
函数测验(){
const[value,setValue]=useState(quizData);
函数handleClick(BTN值,id){
让answer=value.quick\u提问。查找((data)=>data.id==id)。回答;
如果(答案===BTN值){
警惕(“正确答案”);
}否则{
提醒(“请选择正确答案”);
}
控制台日志(应答);
}
返回(
{value.quick_questions.map((quick)=>{
返回(
{quick.instruction_text}

{quick.answer_options.map((btn,索引)=>{ 返回( handleClick(btn,quick.id)} 值={btn} > {btn} ); })} ); })} ); } 导出默认函数App(){ 返回( 你好,代码沙盒 ); }

下面是演示:

您可以在handleClick方法中传递问题id,并使用该id找到正确答案。此外,您还可以直接传递所选答案,而不是传递事件

export default function Quiz() {
  const [value, setValue] = useState(quizData);

  function handleClick(quesId, selectedAnswer) {
    let answer = value.quiz_questions.filter(question => question.id === quesId)[0].answer;
    if (answer === selectedAnswer) {
      alert("Correct Answer");
    } else {
      alert("Please choose the correct answer");
    }
    console.log(selectedAnswer);
    console.log(answer);
  }

  return (
    <div>
      {value.quiz_questions.map((quiz) => {
        return (
          <div key={quiz.id}>
            <p>{quiz.instruction_text}</p>
            {quiz.answer_options.map((btn, index) => {
              return (
                <button key={index} onClick={() => handleClick(quiz.id, btn)} value={btn}>
                  {btn}
                </button>
              );
            })}
          </div>
        );
      })}
    </div>
  );
}
导出默认函数测验(){
const[value,setValue]=useState(quizData);
函数handleClick(quesId,selectedAnswer){
让answer=value.quick\u questions.filter(question=>question.id==quesId)[0]。答案;
如果(回答===所选回答){
警惕(“正确答案”);
}否则{
提醒(“请选择正确答案”);
}
console.log(选择拒绝);
控制台日志(应答);
}
返回(
{value.quick_questions.map((quick)=>{
返回(
{quick.instruction_text}

{quick.answer_options.map((btn,索引)=>{ 返回( handleClick(quick.id,btn)}值={btn}> {btn} ); })} ); })} ); }
您可以尝试修改后的源代码版本(特别是带有map()的版本),您会注意到,已附加了onLoad事件,以帮助在加载文档时捕获答案选项,然后handleClick函数将从中提取。也就是说,以下是源代码的修改版本,在inside return()之后开始:

{value.quick\u questions.map((quick)=>{
返回(
{quick.instruction_text}

{quick.answer_options.map((btn,索引)=>{ 返回( setValue(btn)}onClick={handleClick}value={btn}> {btn} ); })} ); })}
请注意,已合并onLoad事件处理程序,以便在您希望将数据链接到后端api时,它有助于状态管理。
export default function Quiz() {
  const [value, setValue] = useState(quizData);

  function handleClick(quesId, selectedAnswer) {
    let answer = value.quiz_questions.filter(question => question.id === quesId)[0].answer;
    if (answer === selectedAnswer) {
      alert("Correct Answer");
    } else {
      alert("Please choose the correct answer");
    }
    console.log(selectedAnswer);
    console.log(answer);
  }

  return (
    <div>
      {value.quiz_questions.map((quiz) => {
        return (
          <div key={quiz.id}>
            <p>{quiz.instruction_text}</p>
            {quiz.answer_options.map((btn, index) => {
              return (
                <button key={index} onClick={() => handleClick(quiz.id, btn)} value={btn}>
                  {btn}
                </button>
              );
            })}
          </div>
        );
      })}
    </div>
  );
}
    {value.quiz_questions.map((quiz) => {
            return (
              <div key={quiz.id}>
                <p>{quiz.instruction_text}</p>
                {quiz.answer_options.map((btn, index) => {
                  return (
                    <button key={index} onLoad={() => setValue(btn)} onClick={handleClick} value={btn}>
                      {btn}
                    </button>
                  );
                })}
              </div>
            );
    })}