2011-08-25 128 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