[英]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.