javascript中通用id引用的json解析
在我正在进行的一个项目中,我调用了一个rest api,该api返回json,如下所示:javascript中通用id引用的json解析,javascript,json,Javascript,Json,在我正在进行的一个项目中,我调用了一个rest api,该api返回json,如下所示: [ { "id":0, "username":"someone0", "areas":[ ], "role":{ "id":2, "name":"somerole2", "users":null } }, { "id":1,
[
{
"id":0,
"username":"someone0",
"areas":[
],
"role":{
"id":2,
"name":"somerole2",
"users":null
}
},
{
"id":1,
"username":"someone1",
"areas":[
],
"role":{
"id":1,
"name":"somerole1",
"users":null
}
},
{
"id":3,
"username":"someone3",
"areas":[
],
"role":1
}
]
正如您所看到的,用户“someone1”和“someone3”都携带相同的角色对象,但第二次引用(在someone3)时,它仅由其id引用
因为这个api的每个响应都是以这种方式格式化的,所以我正在寻找一种通用的方法来解决这个问题(用完整的对象替换id引用)
对于这个看似共同的问题,有什么共同的解决方案吗
PS:对于标题我很抱歉,我不知道正确的术语(欢迎您提出建议)。您只需将一个函数映射到初始值即可进行这些更正。如果我理解你的意图,这样的方法应该会奏效:
response = response.map( function(x){
if( (typeof x.role) == "number" )
x.role = { id : x.role };
return x;
});
但是,这不会为您提供名称和用户字段。如果这很重要,我建议我们遍历数据一次,列出角色列表,然后返回并填补空白。这看起来像:
roles = {};
response.forEach( function(x){
if( (typeof x.role) != "number" )
roles[x.role.id] = x.role;
});
response = response.map( function(x){
if( (typeof x.role) == "number" )
x.role = roles[x.role];
return x;
});
在您的数据上运行的输出是:
[
{ id: 0,
username: 'someone0',
areas: [],
role: { id: 2, name: 'somerole2', users: null }
},
{ id: 1,
username: 'someone1',
areas: [],
role: { id: 1, name: 'somerole1', users: null }
},
{ id: 3,
username: 'someone3',
areas: [],
role: { id: 1, name: 'somerole1', users: null }
}
]
您可以简单地将进行这些修正的函数映射到初始值。如果我理解你的意图,这样的方法应该会奏效:
response = response.map( function(x){
if( (typeof x.role) == "number" )
x.role = { id : x.role };
return x;
});
但是,这不会为您提供名称和用户字段。如果这很重要,我建议我们遍历数据一次,列出角色列表,然后返回并填补空白。这看起来像:
roles = {};
response.forEach( function(x){
if( (typeof x.role) != "number" )
roles[x.role.id] = x.role;
});
response = response.map( function(x){
if( (typeof x.role) == "number" )
x.role = roles[x.role];
return x;
});
在您的数据上运行的输出是:
[
{ id: 0,
username: 'someone0',
areas: [],
role: { id: 2, name: 'somerole2', users: null }
},
{ id: 1,
username: 'someone1',
areas: [],
role: { id: 1, name: 'somerole1', users: null }
},
{ id: 3,
username: 'someone3',
areas: [],
role: { id: 1, name: 'somerole1', users: null }
}
]
循环遍历数组,并将所有对象角色收集到另一个使用角色ID作为键的对象中。然后遍历数组,用这些对象的引用替换所有数字角色。因此,这不是免费的编码服务。你必须自己尝试解决这个问题。如果您无法让它工作,请发布您尝试的内容,我们将帮助您修复。我会将角色与用户分开,并使所有角色通过ID“引用”。这样可以确保更一致的JSON数据输出,并清楚地将两个组件分开。然后,只需在用户上进行迭代,并在查找now external from users角色后分配相关的JS属性;您正在使用这些响应,而不是“修复”它们并将修复后的版本发回?如果是这样,我更担心的是理解数据,而不是“修复”数据。i、 e.当遇到类型为“
typeof===”number“
”的角色时,您需要从以前读取的数据(可能不存在?)中查找该角色的详细信息。在数组中循环,并将所有对象角色收集到另一个使用角色ID作为键的对象中。然后遍历数组,用这些对象的引用替换所有数字角色。因此,这不是免费的编码服务。你必须自己尝试解决这个问题。如果您无法让它工作,请发布您尝试的内容,我们将帮助您修复。我会将角色与用户分开,并使所有角色通过ID“引用”。这样可以确保更一致的JSON数据输出,并清楚地将两个组件分开。然后,只需在用户上进行迭代,并在查找now external from users角色后分配相关的JS属性;您正在使用这些响应,而不是“修复”它们并将修复后的版本发回?如果是这样,我更担心的是理解数据,而不是“修复”数据。i、 例如,当遇到类型为“typeof===”number“
”的角色时,您需要从以前读取的数据(可能不存在?)中查找该角色的详细信息。有意义的是,我正在进行更新,可以做到这一点。@RobG updated。我认为这应该符合他们现在的需要。@rp.beltran谢谢这确实是我想要的结果。映射方法对我来说是新的。。(js也是)谢谢你接受。map方法将函数应用于集合中的每个项并返回结果。您也可以只使用foreach,一个通用for循环,或者任何您想要解决这个问题的方法。从技术上来说,迭代和更新它会稍微更有效率。祝你学习好运!我认为您可以在一个循环中完成(例如,forEach中的所有循环),因为角色不应该引用位于更大索引中的ID(从常识的角度来看),但这取决于OP。有意义的是,我正在进行一个更新,可以做到这一点。@RobG updated。我认为这应该符合他们现在的需要。@rp.beltran谢谢这确实是我想要的结果。映射方法对我来说是新的。。(js也是)谢谢你接受。map方法将函数应用于集合中的每个项并返回结果。您也可以只使用foreach,一个通用for循环,或者任何您想要解决这个问题的方法。从技术上来说,迭代和更新它会稍微更有效率。祝你学习好运!我认为您可以在一个循环中完成(例如,forEach中的所有循环),因为角色不应该引用索引更大的ID(从常识的角度来看),但这取决于操作。