Reputation: 193
I have an empty object structured like so :
let users = {
"type1": {
"group1": {
"role1": {}
},
"group2": {
"role2": {},
"role3": {},
"role4": {}
},
},
"type2": {
"group1": {
"role1": {}
},
"group2": {
"role2": {}
},
"group3": {
"role3": {},
"role4": {}
}
}
};
I am then fetching my users with an associated type, group and role for each one. I would like to dynamically add my users to my object above in the right type/group/role combination as they are stored in variables.
I tried something like this but this is wrong:
fetchedUsers.forEach(user => {
users[user.type][user.group][user.role].push(user.email);
})
Is there a way to do this similar to what I tried ?
Upvotes: 0
Views: 163
Reputation: 177692
You cannot push to an object. Your role is not an array
let users = {
"type1": { "group1": { "role1": {} },
"group2": { "role2": {}, "role3": {}, "role4": {}},},
"type2": { "group1": { "role1": {} },
"group2": { "role2": {}},
"group3": { "role3": {}, "role4": {}}}};
const fetchedUsers = [
{"type":"type1","group": "group2", "role":"role3", "email":"[email protected]"},
{"type":"type2","group": "group1", "role":"role1", "email":"[email protected]"}
];
fetchedUsers.forEach(
({type,group,role,email}) => users[type][group][role].email = email
);
console.log(users)
If you have more than one email per role, you need to make some keys
let users = {
"type1": { "group1": { "role1": {} },
"group2": { "role2": {}, "role3": {}, "role4": {}},},
"type2": { "group1": { "role1": {} },
"group2": { "role2": {}},
"group3": { "role3": {}, "role4": {}}}};
const fetchedUsers = [
{"type":"type1","group": "group2", "role":"role3", "email":"[email protected]"},
{"type":"type2","group": "group1", "role":"role1", "email":"[email protected]"},
{"type":"type2","group": "group1", "role":"role1", "email":"[email protected]"}
];
fetchedUsers.forEach(
({type,group,role,email}) => {
const currentRole = users[type][group][role]
const len = Object.entries(currentRole).length
currentRole[`email${len}`] = email
});
console.log(users)
or use an array
let users = {
"type1": { "group1": { "role1": {} },
"group2": { "role2": {}, "role3": {}, "role4": {}},},
"type2": { "group1": { "role1": {} },
"group2": { "role2": {}},
"group3": { "role3": {}, "role4": {}}}};
const fetchedUsers = [
{"type":"type1","group": "group2", "role":"role3", "email":"[email protected]"},
{"type":"type2","group": "group1", "role":"role1", "email":"[email protected]"},
{"type":"type2","group": "group1", "role":"role1", "email":"[email protected]"}
];
fetchedUsers.forEach(
({type,group,role,email}) => {
const currentRole = users[type][group][role]
currentRole.emails = currentRole.emails || []
currentRole.emails.push(email)
});
console.log(users)
Upvotes: 4
Reputation: 19
Since users[user.type][user.group][user.role]
is an object you can't use push()
If you initialise the empty role structures as arrays it should work.
let users = {
"type1": {
"group1": {
"role1": []
},
"group2": {
"role2": [],
"role3": [],
"role4": []
},
},
"type2": {
"group1": {
"role1": []
},
"group2": {
"role2": []
},
"group3": {
"role3": [],
"role4": []
}
}
};
Upvotes: 2