javascript中通用id引用的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,

在我正在进行的一个项目中,我调用了一个rest api,该api返回json,如下所示:

[  
   {  
      "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(从常识的角度来看),但这取决于操作。