2012-04-09 49 views
4

我將一些JSON數據存儲在文本文件中,以便在我的頁面中使用jQuery Ajax進行查詢。目前,我的文本文件包含大約10個數據面(可能包含額外的30個數據面)。 JSON數據包含這些問題的問題和答案。jQuery AJAX和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)的限制,我不得不使用文本文件來存儲問題。

+0

很多大的響應。如果我能標記他們所有正確的我會。我將執行idrumgood,Jonathan M和Robert Messerle的迴應。 – sbhomra 2012-04-10 07:36:55

+0

這是關於SO的偉大之處之一:結合答案以獲得最佳實施。祝你好運! – 2012-04-10 14:33:44

回答

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 2012-04-10 07:29:59

0

爲什麼不將邏輯移動到像PHP這樣的服務器端腳本,它可以接收POST參數並對JSON集執行查詢並僅返回希望接收的記錄。或者,如果您打算將它保留在所有js中,則可以將JSON(只要它是非敏感數據)存儲在本地變量中,並在本地進行查詢。

+0

我想。但是我在使用的技術上沒有任何靈活性。 – sbhomra 2012-04-10 07:26:21

1

爲什麼不改變你的結構Q &一個對象包含每個問題的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" 
     } 
} 

如果這是分配給result,並Q2id傳遞給GetAnswer(id),你可以很容易return result.myQuiz[id].a;

作爲替代方案,如果該問題的順序是一致的,你可以使用一個包含q和一對數組的對象,並通過索引而不是id來引用它們。

0

你可以在服務器上加載一些機制來加載數據。然後你可以發送類似QuestionName和過濾數據的參數。這將降低線路上發送的有效載荷。

1

問題是你的async設置爲false。這不好。這會在瀏覽器等待您的請求時暫停,並且會導致性能下降。

+0

從來沒有想過這樣做。將做出改變。 – sbhomra 2012-04-10 07:30:43