2013-04-13 35 views
0

我在StackOverflow上发现了很多线程,讨论解析json数组,但我似乎无法弄清楚如何找回某些数据。以下是我有...在JavaScript中解析json数组与未知的字段名称

$('#keyword_form').submit(function(e){ 
     var gj = $.post('employee_search.php',$('#keyword_form').serialize(),function(data){     
      if(!data || data.status !=1) 
      { 
       alert(data.message); 
       return false; 
      } 
      else 
      { 
       alert(data.message); 
      } 
     },'json'); 
     e.preventDefault(); 

    }); 

JSON数据发送给它看起来像这样...

{ 
    "status":1, 
    "message":"Query executed in 9.946837 seconds.", 
    "usernames_count":{ 
     "gjrowe":5, 
     "alisonrowe":4, 
     "bob":"1" 
    } 
} 

正如我的功能显示我可以做alert(data.message);,但我怎么能访问usernames_count数据?

我的疑惑来自数据没有名称/标签的事实。 bob是一个用户名和1是与该用户名

相关联。如果我做alert(usernames_count);我回来[object Object]

如果我做alert(usernames_count[0]);我回来了返回的计数undefined

我相信我应该做的事与JSON.parse();,但我还没有得到它的权利尚未

+0

您是否有可能更改返回的数据? 'usernames_count'应该是一个数字,一个新的'users'字段应该是一个拥有用户的数组。你不觉得吗? –

+0

可能会让您感到困惑的一件事是,usernames_count不是数组,它是一个JSON对象。 – elevine

+0

这是一个JavaScript对象,因此您可以使用'for ... in'或'Object.keys'来遍历这些键。在ES6中,你也可以“为... ...”。 – ZER0

回答

4

试试这个:

$.each(data.usernames_count, function(username, val) { 
    alert(username+" has a value of "+val); 
}); 
+0

是......那个窍门 - 100% –

4

可以使用Object.keysfor…in循环 - 还记得在这种情况下使用hasOwnProperty

var users = data.usernames_count; 
Object.keys(users).forEach(function(user) { 
    console.log(user, users[user]); 
}); 
+0

请记住,这在所有旧版浏览器中都不受支持。有关于如何添加向后功能的指南[这里](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys)。 –

+0

@HannesJohansson如果旧版浏览器不支持它,我是否更安全地使用其他使用jQuery的答案? –

+0

如果你依靠jQuery没有问题,当然。而且看起来你使用的是jQuery,所以我会选择这个解决方案。如果你想要的代码不依赖于jQuery,你可以像在Mozilla指南中那样修补Object。 –

0

这听起来像你的问题是如何通过在usernames_count对象的条目进行迭代。您可以这样做:

var key = ''; 
for(key in data.usernames_count) { 

    //check that this key isn't added from the prototype 
    if(data.usernames_count.hasOwnProperty(key) { 
     var value = data.usernames_count[key]; 

     //do something with the key and value 
    } 
}