Tengo un objeto vacío estructurado así:
let users = { "type1": { "group1": { "role1": {} }, "group2": { "role2": {}, "role3": {}, "role4": {} }, }, "type2": { "group1": { "role1": {} }, "group2": { "role2": {} }, "group3": { "role3": {}, "role4": {} } } };Luego busco a mis usuarios con un tipo, grupo y rol asociados para cada uno. Me gustaría agregar dinámicamente a mis usuarios a mi objeto anterior en la combinación correcta de tipo/grupo/rol, ya que están almacenados en variables.
Intenté algo como esto pero esto está mal:
fetchedUsers.forEach(user => { users[user.type][user.group][user.role].push(user.email); })¿Hay alguna manera de hacer esto similar a lo que probé?
No se puede empujar a un objeto. Tu rol no es una matriz
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":"x@useremail.com"}, {"type":"type2","group": "group1", "role":"role1", "email":"y@useremail.com"} ]; fetchedUsers.forEach( ({type,group,role,email}) => users[type][group][role].email = email ); console.log(users)Si tiene más de un correo electrónico por rol, necesita hacer algunas claves
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":"x@useremail.com"}, {"type":"type2","group": "group1", "role":"role1", "email":"y@useremail.com"}, {"type":"type2","group": "group1", "role":"role1", "email":"z@useremail.com"} ]; 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)o usar una matriz
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":"x@useremail.com"}, {"type":"type2","group": "group1", "role":"role1", "email":"y@useremail.com"}, {"type":"type2","group": "group1", "role":"role1", "email":"z@useremail.com"} ]; fetchedUsers.forEach( ({type,group,role,email}) => { const currentRole = users[type][group][role] currentRole.emails = currentRole.emails || [] currentRole.emails.push(email) }); console.log(users)Dado users[user.type][user.group][user.role] es un objeto que no puede usar push()
Si inicializa las estructuras de roles vacías como matrices, debería funcionar.
let users = { "type1": { "group1": { "role1": [] }, "group2": { "role2": [], "role3": [], "role4": [] }, }, "type2": { "group1": { "role1": [] }, "group2": { "role2": [] }, "group3": { "role3": [], "role4": [] } } };