2012-04-09 13 views
4

私のページでjQuery Ajaxを使用してクエリを行うために、いくつかのJSONデータをテキストファイルに保存しています。現在、私のテキストファイルには約10個のデータ面が含まれています(データにはさらに30個のファセットが含まれている可能性があります)。 JSONデータには、これらの質問に対する質問と回答が含まれています。私のJavaScriptファイルでjQuery AJAXとJSONパフォーマンスクエリ

、私はデータの特定のビットを取得するために、セットアップ異なる機能を持っています。例えば

:あなたは私のコードスニペットから見ることができるように

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)を使用しています技術の制限のための質問を保存するために、テキストファイルを使用する必要がしています。

+0

偉大な回答がたくさん。私はそれらをすべて正しいとマークすることができたら私はそうするでしょう。私はidrumgood、Jonathan MとRobert Messerleの反応を実装する予定です。 – sbhomra

+0

これは、SOに関する素晴らしいことの1つです。答えを組み合わせて、可能な限り最良の実装を実現します。がんばろう! –

答えて

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 ; 
    } 
}); 
+0

これは素晴らしいアイデアです。私はいつもJSONデータセットをループすると、パフォーマンスがテキストファイルに読み込まれないことになると思っていました。 – sbhomra

0

なぜPOSTパラメータに取り、JSONセットに対してクエリを実行し、あなたが受け取りたいだけレコードを返すことができますPHPなどのサーバーサイドスクリプトにロジックを移動しません。または、すべてのjでこれを保持するつもりならば、JSONを(非機密データでない限り)ローカル変数に格納し、それをローカルに照会するだけで済みます。

+0

私はしたいと思います。しかし、私は使用している技術に柔軟性がありません。 – sbhomra

1

はなぜ各質問のためのIDを含めるようにQ &オブジェクトの構造を変更し、IDにオブジェクトの属性を作ってみませんか?次に、IDをGetAnswer()に渡して、正しい属性を参照することによって正しい質問に直接移動することができますか?これはresultに割り当てられている、との質問の順序がある場合Q2idは、別の方法としてGetAnswer(id)、あなたは可能性が簡単にreturn result.myQuiz[id].a;

に渡された場合

{"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" 
     } 
} 

:オブジェクトは、このようになります。一貫して、qと1つのペアの配列を含むオブジェクトを使用し、idではなくインデックスで参照することができます。

0

サーバー上で何らかのメカニズムを使ってデータを読み込むことができます。次に、QuestionNameやフィルターデータなどのパラメーターを送信できます。これにより、ワイヤで送信されるペイロードが少なくなります。

1

問題は、あなたがfalseからasyncセットを持っているということです。これは悪いです。これにより、ブラウザがリクエストを待っている間にブラウザが停止し、パフォーマンスが非常に遅く感じられます。

+0

これを行うことは決して考えられませんでした。変更を行います。 – sbhomra