2011-08-25 171 views
0

基本上我試圖返回從Ajax請求獲取的名稱列表。當只有一個名字時,它完美地起作用。然而,有了多個名字,我開始看到我無法解釋的行爲。Jquery Ajax Json對象

function getIDFromInput(input){ 
    sendToID = new Array; //An Array of "Name :Id" 
    $.ajax({ 
     type:"GET", 
     url: "user_search.php", 
     contentType:"application/x-www-form-urlencoded; charset=utf-8", 
     dataType:"json", 
     async:false,  
     data: "q="+input, 
     success:function(data){ 
      if(data.success){ 
       var userLength = data.success.length;     
       if(userLength == 1){ // For one user everything works fine 
        var userNum = data.success.users[0];       
        var userName = data.success.usersNames[userNum];       
        sendToID[0] = userName + " :"+userNum; 

       } 
       else if(userLength > 1){ // Multiple users it fails 

        for(i = 0; i < userLength; i++){ 

         var userNum = data.success.users[i]; 
         //this call works 
         var userName = data.success.usersNames[userNum]; 
         //this call fails, even though it seems to be the same call as above 
         sendToID[i] = userName + " :"+userNum; 
        }      
       } 
       else if(userLength < 1){ // never enter here 
       } 
      }   
     }, 
     error:function(data){ //After it fails it goes into here 

     } 
    }); 
    return sendToID; 
} 

我傳遞迴< 2,JSON(即不工作的人,正下方)

{"success":{"length":2,"userNames":[{"5":"Travis Baseler"},{"6":"Ravi Bhalla"}],"users":["5","6"]}} 

我回傳,做的工作是

之一的JSON
{"success":{"length":"1","usersNames":{"6":"Ravi Bhalla"},"users":["6"]}} 

有誰知道爲什麼第一個作品,但第二個沒有?

+4

你應該避免同步AJAX請求時可能 – meagar

+2

@meagar:我知道我要出去在這邊,但我確定有一個同步的理由。如果他對JS/jQuery一無所知,他甚至不知道這個選項是否存在。 –

+0

一旦你理清了數據格式,所有的情況都是一樣的,你根本不需要if/else。您可以從for循環執行所有三個分支。 for循環自動處理0的長度,1的長度和> 1的長度。 – jfriend00

回答

7

在第一示例中,"usernames"是一個數組,並且在一個秒它是一個對象
(注意在不在第二個存在的第一個例子的[])。
請參閱@ meagar的評論,這比我更好地解釋了這一點。

還有一些要點:
1.您使用數字作爲對象屬性名稱;這(IMO)不推薦,因爲它有點混亂。
var userNum = data.success.users.length
3.那豈不是更有意義具有在{ 'userNum': X, 'username': Y }格式的對象:
2.你可以使用一個數組的.length屬性獲得數組的長度?這樣你可以只返回一個數組:
success: [ {'userNum': 5, 'username': 'Travis Baseler'}, {'userNum': 6, 'username': 'Ravi Bhalla'}]

+1

他的意思是,'users [「6」]'將在'userNames'爲'{{ 「6」:「Ravi ...」}'。但是當你以'[{「5」:...},{「6」:...}]'的形式返回一個數組時,'usernames [「6」]'不再被定義。你應該以'{「5」:「Travis ...」,「6」:「Ravi ...」}'的形式輸出'userNames'。 – meagar

+0

非常感謝!按照我目前的方案,訪問用戶名的正確方法是什麼? 對於訪問對象不會使用「。」? 我將改變我的輸出方法,因爲上面更清晰,但在這一點上,我很困惑以上是什麼正確的語法。 data.success.usersNames.userNum仍然失敗。 –

+3

與當前的數據類型,我認爲@scrappedcola有正確的答案。但你的主要問題是:a。您將針對不同情況返回不同的數據結構,這非常糟糕(請參閱上面的@ meagar評論)和b。您以低效率的方式返回數據。如果你嘗試我的建議,你可以做'success [i] .userNum'或者'success [i] .username'這個更清潔 –

1

您的循環應該是這樣的:

for(i = 0; i < userLength; i++){ 
var userNum = data.success.users[i]; 
    //this call works 
    var userName = data.success.userNames[i][userNum];//you need to index the user in the array in the object uisng the loop then user the userNum to get your userName. 
    sendToID[i] = userName + " :"+userNum; 
} 
+0

一個jsfiddle顯示這裏是:http://jsfiddle.net/53bLV/1/ – scrappedcola