我正在从数据库中收集答案行,这些答案是在数组中生成的。类似的东西:
for (var i:int = 0; i < event.result.length; i++) {
var data = event.result[i];
var answer:Array = new Array(data["question_id"], data["focus_id"], data["attempts"], data["category"], data["answer"], data["correct"], data["score"]);
trace("answer: " + answer);
restoreAnswer(answer, i);
}
现在,如果我trace answer
,我通常会得到类似的结果:
回答:5,0,2,IK,1.a,3.1,0
回答:5,0,1,IK,2.a,3.1,0
回答:4,1,1,AK,3,3,2
从这里我们看到question_id 5(第一个数组项)中的focus_id 0(第二个数组项)已经尝试了两次(第三个数组项),我只想在我的restoreAnswer
函数中使用最后一次尝试
我的问题是,第一次尝试的答案会覆盖第二次尝试,因为第一次尝试似乎是最后一次解析。如何仅在适当时才调用我的restoreAnswer
?
选项包括:
1次尝试,正确得分(2分)
2次尝试,正确得分(1分)
1次尝试,错误分数(0分)
2次尝试,错误分数(0分)
每个question_id中可以有多个focus_id。
非常感谢! :)
答案 0 :(得分:1)
我会考虑让数据库查询仅返回最近的尝试,或者如果它不能有效工作,则按尝试顺序返回数据。您可以对问题5进行两次评分,但至少它会在最后一次评分中得分正确。
您还可以对从服务器返回的数据进行过滤或排序。
答案 1 :(得分:0)
Michael Brewer-Davis建议使用数据库查询来解决这个问题;通常来说,这将是正确的解决方案。
如果您等到从Web方法调用或AS3中的任何内容返回,请考虑创建一个额外的Vector变量:
var vAttempts:Vector.<Vector.<int>> = new Vector.<Vector.<int>>(this.m_iNumQuestions);
您提到似乎所有内容都已排序,以便之前的尝试最后一次。首先,你要确保这是真的。如果是,那么在您拨打restoreAnswer()
之前,您需要检查vAttempts
以确保您尚未为restoreAnswer()
调用question_id
和focus_id
:
if (!vAttempts[data["question_id"]])
{
vAttempts[data["question_id"]] = new Vector.<int>(); // ensuring a second dimension
}
if (vAttempts[data["question_id"]].indexOf(data["focus_id"]) == -1)
{
restoreAnswer(answer, i);
vAttempts[data["question_id"]].push(data["focus_id"]);
}
所以稍微优化一下,你将拥有如下:
private final function resultHandler(event:ResultEvent):void {
var vAttempts:Vector.<Vector.<int>> = new Vector.<Vector.<int>>(this.m_iNumQuestions);
var result:Object = event.result;
var iLength:int = result.length;
for (var i:int = 0; i < iLength; i++) {
var data = result[i];
var iQuestionID:int = data["question_id"];
var iFocusID:int = data["focus_id"];
var answer:Array = [iQuestionID, iFocusID, data["attempts"],
data["category"], data["answer"], data["correct"], data["score"]];
trace("answer: " + answer);
var vFocusIDs:Vector.<int> = vAttempts[iQuestionID];
if (!vFocusIDs) {
vAttempts[iQuestionID] = new <int>[iFocusID];
restoreAnswer(answer, i);
} else if (vFocusIDs.indexOf(iFocusID) == -1) {
restoreAnswer(answer, i);
vFocusIDs.push(iFocusID);
}
}
}
注意:在AS3中,数组可以跳过某些索引,但是Vector不能。因此,如果您的程序尚未对问题数量有某种预知,那么您需要将vAttempts
从Vector更改为数组。还要考虑问题ID是否为0索引(如此问题所假设)或1索引。