使用以下对象,如何将 roles
=> name
添加到 sites
=> userPermission
对象具有匹配的 roleId
?
例如,第一个 sites
条目的 userPermission
键将更新为:
"userPermission": {
"roleId": 6,
"roleName": "Field Representative"
}
一旦映射了roleName
键,就不再需要roles
数组,并且可以将其从最终结果中删除,如预期结果所示.
const obj = {
"id": 542,
"createdAt": "2018-12-06T22:34:12.553Z",
"sites": [
{
"id": 10,
"siteId": "sixtysixone",
"edition": "pro",
"userPermission": {
"roleId": 6
}
},
{
"id": 2,
"siteId": "amplify",
"edition": "pro",
"userPermission": {
"roleId": 4
}
}
],
"roles": [
{
"id": 6,
"name": "Field Representative"
},
{
"id": 4,
"name": "Program Manager"
}
]
};
预期结果:
const outcome = {
"id": 542,
"createdAt": "2018-12-06T22:34:12.553Z",
"sites": [
{
"id": 10,
"siteId": "sixtysixone",
"edition": "pro",
"userPermission": {
"roleId": 6,
"roleName": "Field Representative"
}
},
{
"id": 2,
"siteId": "amplify",
"edition": "pro",
"userPermission": {
"roleId": 4
"roleName": "Program Manager"
}
}
]
};
我尝试过结合使用 .map
和 .find
,但感觉有一种更简单/可读的方法来实现此目的。
const outcome = obj.map(o => ({
...o,
sites: o.sites
.map(s => ({
...s,
roleName: o.roles
.find(r => r.id === s.roleId).name,
})),
}));
最佳答案
创建 Angular 色 map :
const roles = new Map(obj.roles.map(({ id, name }) => [id, { roleId: id, roleName: name }]));
然后你就可以查找:
const outcome = {
...obj,
sites: obj.sites.map(site => ({
...site,
userPermission: roles.get(site.userPermission.roleId),
}),
roles: undefined,
};
关于javascript - 将嵌套对象键映射到另一个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54830560/