检查AS3中的数组

时间:2015-03-23 14:10:47

标签: arrays actionscript-3 flash

我正在从数据库中收集答案行,这些答案是在数组中生成的。类似的东西:

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。

非常感谢! :)

2 个答案:

答案 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_idfocus_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索引。