2013-02-01 85 views
2

我有两个从两个不同的休息资源返回的对象。如何通过“外键”关系组合json对象

{ 
"id": 1, 
"username": "jdoe" 
} 

{ 
"role_id": 1, 
"role": "developer", 
"members": [ 
    1, 
    3, 
    5 
] 
} 

我想使用纯OLE JavaScript来基于这两个对象合并成一个其中id是成员数组中,让我回来的对象一样具有角色的顶部节点,然后列出用户在下面的角色。

轻松完成?

+4

所以这大约MANIP问题使用JavaScript对象,而不使用JSON?如果你能提供结果的例子,这将是有帮助的。没有像“JSON对象”那样的东西:http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/。 –

+0

给每个人自己。作为您链接到状态的文章,Crockford使用术语JSON对象。但这是一个很好的观点+1。 – Jason

回答

4

几个星期前,我有一个类似的问题,我想与一组10个AJAX调用进行网格化。一个简单的方法是根据id值创建查找表,然后使用查找表合并结果。下面是使用多个用户和多个角色的例子:

var users = [ 
    { "id": 1, "username": "jdoe" }, 
    { "id": 3, "username": "dbob" }, 
    { "id": 5, "username": "jske" } 
]; 
var roles = [ 
    { "role_id": 1, "role": "developer", "members": [1,3,5] }, 
    { "role_id": 2, "role": "admin", "members": [5] } 
]; 

// create lookup table 
for (var i = 0; i < users.length; i++) 
    users.lookup[users[i].id] = users[i]; 

// populate members from users with lookup table 
for (var i = 0; i < roles.length; i++) 
    for (var j = 0; j < roles[i].members.length; j++) 
     roles[i].members[j] = users.lookup[roles[i].members[j]]; 

现在角色的成员,而不是给用户引用刚刚的id:

[ 
    { "role_id": 1, "role": "developer", "members": 
    [{ "id": 1, "username": "jdoe" }, 
    { "id": 3, "username": "dbob" }, 
    { "id": 5, "username": "jske" }] }, 
    { "role_id": 2, "role": "admin", "members": 
    [{ "id": 5, "username": "jske" }] } 
] 

而且你可以像一个角色引用的用户名这样的:

for (var i = 0; i < roles[0].members.length; i++) 
    alert(roles[0].members[i].username); 

演示:http://jsfiddle.net/2aqR5/1/