4

ページでjQueryAjaxを使用してクエリを実行するために、JSONデータをテキストファイルに保存しています。現在、私のテキストファイルには約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"
        }
}

これが に割り当てられresultidQ2に渡された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 に答える