4

我将一些 JSON 数据存储在一个文本文件中,以便在我的页面中使用 jQuery Ajax 进行查询。目前,我的文本文件包含大约 10 个方面的数据(可能包含另外 30 个方面的数据)。JSON 数据包含一个问题和这些问题的答案。

在我的 JavaScript 文件中,我设置了不同的函数来获取特定的数据位。

例如:

function GetAnswer(questionName) {
    var correctAnswer = null;

    jQuery.ajax({
        type: "GET",
        url: "../content/questions.txt",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: "",
        async: false,
        success: function (result) {
            $.each(result, function (i, q) {    
                if (q.questionID == questionName) {
                    correctAnswer = q.correctAnswer;
                    return false;
                }
            });
        },
        error: function () {   },
        complete: function () {   }
    });

    return correctAnswer ;
}

正如您从我的代码片段中看到的那样,我正在循环通过我的 JSON 来获取我需要的数据。我还有其他以类似方式编码的函数来获取问题类型、问题名称等。

我发现我一个接一个地调用这些函数来获取我需要的数据。我认为从性能的角度来看,我查询 JSON 数据的方式并不好,因为我循环遍历整个 JSON 数据集,直到找到匹配项。

有没有更好的方法来查询我的 JSON 数据?

注意:由于我使用的技术(SCORM 1.2)的限制,我不得不使用文本文件来存储问题。

4

5 回答 5

2

循环遍历您的 JSON 对象相对较快。缓慢的(相对而言)是每次都加载该文本文件(尽管它可能被缓存)。

无论哪种方式,我建议在用户第一次启动问题/答案情况时加载 JSON,或者只是在页面加载时加载它(您可以异步执行)并将其存储以供以后使用。

后者的例子:

jQuery(document).ready(function(){
    var questions = '';

    jQuery.ajax({
        type: "GET",
        url: "../content/questions.txt",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: "",
        async: false,
        success: function (result) {
            questions = result;
        },
        error: function () {   },
        complete: function () {   }
    });

    function GetAnswer(questionName) {
        var correctAnswer = null;
        $.each(questions, function (i, q) {    
            if (q.questionID == questionName) {
                correctAnswer = q.correctAnswer;
                return false;
            }
        });

        return correctAnswer ;
    }
});
于 2012-04-09T20:19:52.767 回答
1

为什么不更改 Q&A 对象的结构以包含每个问题的 id,并使 id 成为对象中的属性?然后您可以将 id 传递给 GetAnswer() 并通过引用正确的属性让它直接进入正确的问题?该对象可能如下所示:

{"myQuiz" :
    "Q1" :
        { "q" : "What color was George Washington's white horse?",
          "a" : "White"
        },
    "Q2" :
        { "q" : "In what city would you find the Leaning Tower of Pisa?",
          "a" : "Pisa"
        }
}

如果 this 被分配给result,并且 anidQ2传递给GetAnswer(id),你可以很容易地return result.myQuiz[id].a;

作为替代方案,如果问题的顺序是一致的,您可以使用包含 q 和 a 对的数组的对象,并通过索引而不是 id 来引用它们。

于 2012-04-09T20:14:15.437 回答
1

问题是您已async设置为false. 这是不好的。这会在等待您的请求时停止浏览器,并且会导致性能感觉非常滞后。

于 2012-04-09T20:15:08.623 回答
0

为什么不将逻辑移动到像 PHP 这样的服务器端脚本,它可以接受 POST 参数并针对 JSON 集执行查询并仅返回您希望接收的记录。或者,如果您打算将其保留在所有 js 中,您可以简单地将 JSON(只要它是非敏感数据)存储在本地变量中并在本地查询它。

于 2012-04-09T20:13:52.967 回答
0

您可以在服务器上建立某种机制来加载数据。然后您可以发送诸如 QuestionName 之类的参数并过滤数据。这将降低通过网络发送的有效载荷。

于 2012-04-09T20:14:29.443 回答