簡體   English   中英

努力循環遍歷一組對象

[英]Struggling to loop through an array of objects

特別是我想訪問答案的數值,以便稍后總結它們。

以前嘗試過的長度,它不適用於對象。

這是我的數據:

const qData = [
    {
        id: 0,
        question: "question 1",
        answers: [
            { value: 1, text: "rafael" },
            { value: 2, text: "dontaelo" },
            { value: 3, text: "leonardo" },
            { value: 4, text: "michelangelo" }
        ]
    },
    {
        id: 1,
        question: "question 2",
        answers: [
            { value: 1, text: "rafael" },
            { value: 2, text: "dontaelo" },
            { value: 3, text: "leonardo" },
            { value: 4, text: "michelangelo" }
        ]
    }
];

export default qData;

我試圖對答案值求和,如下所示:

handleShowScore = () => {
  var i, newScore;
  var a = qData.answers;

  for (i = 0; i < a.length; i++) {
    newScore = newScore + a[i].value;
  }
}

如果我正確理解了您的問題,下面的示例可以滿足您的要求

// Loop through all questions. Each question is stored in "q".
qData.forEach((q) => {
  console.log('qData:', q);
​
  // Make an array of all answer values   
  const answerValues = q.answers.map((a) => {
     return a.value;
  });
  console.log('answerValues:', answerValues);
​
  // Sum all answer values together
  const totalValues = answerValues.reduce((a, b) => a + b, 0)
  console.log('totalValues: ', totalValues);
});

如果您想獲得特定ID的總和

// Find specific ID.
const question = qData.find((q) => q.id === 0);

// Make an array of all answer values   
const answerValues = question.answers.map((a) => {
   return a.value;
});
console.log('answerValues:', answerValues);

// Sum all answer values together
const totalValues = answerValues.reduce((a, b) => a + b, 0)
console.log('totalValues: ', totalValues);

qData是一個數組,沒有answers屬性,因此qData.answers將不起作用並返回undefined

您首先必須遍歷問題,然后在每個問題中您必須遍歷答案:

 const qData = [{id:0,question:"question 1",answers:[{value:1,text:"rafael"},{value:2,text:"dontaelo"},{value:3,text:"leonardo"},{value:4,text:"michelangelo"}]},{id:1,question:"question 2",answers:[{value:1,text:"rafael"},{value:2,text:"dontaelo"},{value:3,text:"leonardo"},{value:4,text:"michelangelo"}]}]; let sum = 0; for (const question of qData) { for (const answer of question.answers) { sum += answer.value; } } console.log(sum);

如果你使用flatMap ,你可以這樣做減少循環的數量。 將答案匯總到一個大數組中。

 const qData = [{id:0,question:"question 1",answers:[{value:1,text:"rafael"},{value:2,text:"dontaelo"},{value:3,text:"leonardo"},{value:4,text:"michelangelo"}]},{id:1,question:"question 2",answers:[{value:1,text:"rafael"},{value:2,text:"dontaelo"},{value:3,text:"leonardo"},{value:4,text:"michelangelo"}]}]; const answers = qData.flatMap(question => question.answers); let sum = 0; for (const answer of answers) { sum += answer.value; } console.log(sum);

除了使用 for 循環對值求和之外,您還可以使用reduce ,它遍歷一個數組,將其減少為單個值。

 const qData = [{id:0,question:"question 1",answers:[{value:1,text:"rafael"},{value:2,text:"dontaelo"},{value:3,text:"leonardo"},{value:4,text:"michelangelo"}]},{id:1,question:"question 2",answers:[{value:1,text:"rafael"},{value:2,text:"dontaelo"},{value:3,text:"leonardo"},{value:4,text:"michelangelo"}]}]; const answers = qData.flatMap(question => question.answers); const sum = answers.reduce((sum, answer) => sum + answer.value, 0); console.log(sum);

這有點像測驗,對吧? 假設我的答案是:

const myAnswers = [{question: 'question 1', myAnswer:'rafael'},{question: 'question 2', myAnswer:'dontaelo'}]

我應該從第一個問題中得到 1 分,從第二個問題中得到 2 分。 我們需要go通過2個循環:1找到對應的問題,1找到對應的點數:

const myPoints = myAnswers.map(answer => qData.find(question => question.question === answer.question).answers.find(possibleAnswer => possibleAnswer.text === answer.myAnswer).value)

這給了我 [1, 2]。 現在我們需要用reduce求和:

const reducer = (accumulator, currentValue) => accumulator + currentValue;
const myScore = myPoints.reduce(reducer, 0);

我有 3 分;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM