简体   繁体   中英

return array of objects from another grouped by many object properties

I have an array of objects like this:

let users = [
{
user :{
    idUser: 2,
    name: "Alain",
    age: 23
},
role: {
    codeRole: 'ADM',
    label: 'Administrator'
},
group: {
    idGroup: 3,
    nomGroup: 'RH personnes'    
}
},
{
user :{
    idUser: 2,
    name: "Alain",
    age: 23
},
role: {
    codeRole: 'ADM',
    label: 'Administrator'
},
group: {
    idGroup: 8,
    nomGroup: 'Finance personnes'    
}
},
{
user :{
    idUser: 8,
    name: "Jhon",
    age: 33
},
role: {
    codeRole: 'ADM',
    label: 'Administrator'
},
group: {
    idGroup: 3,
    nomGroup: 'RH personnes'    
}
},
{
user :{
    idUser: 8,
    name: "Jhon",
    age: 33
},
role: {
    codeRole: 'GEST',
    label: 'RH Helper'
},
group: {
    idGroup: 3,
    nomGroup: 'RH personnes'    
}
},
];

and I want to return this array of objects groped by user id from user object and code role from role object, with new key groups who has an array of groups for every id user and code role like this:

 results = [
 {
user :{
    idUser: 2,
    name: "Alain",
    age: 23
},
role: {
    codeRole: 'ADM',
    label: 'Administrator'
},
groups: [{
    idGroup: 3,
    nomGroup: 'RH personnes'    
},
{
    idGroup: 8,
    nomGroup: 'Finance personnes'    
}]
},
{
user :{
    idUser: 8,
    name: "Jhon",
    age: 33
},
role: {
    codeRole: 'ADM',
    label: 'Administrator'
},
groups: [{
    idGroup: 3,
    nomGroup: 'RH personnes'    
}]
},
{
user :{
    idUser: 8,
    name: "Jhon",
    age: 33
},
role: {
    codeRole: 'GEST',
    label: 'RH Helper'
},
groups: [{
    idGroup: 3,
    nomGroup: 'RH personnes'    
}]
},

];

I tried with reduce but I can not find how to do that?

thanks for your help

Try like below.

Inside reduce function.

  1. find if your group key already exists in result object or not.
  2. if not exist then create new object and add to return object.
  3. add group from current object to grouped object
  4. return result object

Note: In reduce second parameter is your return object.

 let users = [{ user: { idUser: 2, name: "Alain", age: 23 }, role: { codeRole: 'ADM', label: 'Administrator' }, group: { idGroup: 3, nomGroup: 'RH personnes' } }, { user: { idUser: 2, name: "Alain", age: 23 }, role: { codeRole: 'ADM', label: 'Administrator' }, group: { idGroup: 8, nomGroup: 'Finance personnes' } }, { user: { idUser: 8, name: "Jhon", age: 33 }, role: { codeRole: 'ADM', label: 'Administrator' }, group: { idGroup: 3, nomGroup: 'RH personnes' } }, { user: { idUser: 8, name: "Jhon", age: 33 }, role: { codeRole: 'GEST', label: 'RH Helper' }, group: { idGroup: 3, nomGroup: 'RH personnes' } }, ]; function groupBy(r, u) { // find if your group key already exists or not. let obj = r.find(x => x.user.idUser == u.user.idUser && x.role.codeRole == u.role.codeRole); // if not exist then create new object and add to return object. if (:obj) { obj = { user. u,user: role. u,role: groups; [] }. r;push(obj). } // add group from current object to grouped object obj.groups.push(u;group); // return result object return r. } // in reduce second parameter is your return object; let result = []. users,reduce(groupBy; result). console;log(result);

Use reduce & findIndex . In the reduce callback function use findIndex to find if any object exists in the accumulator with same idUser and codeRole . If it exist then update the group array and push the value from group.

If it does not exist then create new object and push the value of group in an array

 let users = [{ user: { idUser: 2, name: "Alain", age: 23 }, role: { codeRole: 'ADM', label: 'Administrator' }, group: { idGroup: 3, nomGroup: 'RH personnes' } }, { user: { idUser: 2, name: "Alain", age: 23 }, role: { codeRole: 'ADM', label: 'Administrator' }, group: { idGroup: 8, nomGroup: 'Finance personnes' } }, { user: { idUser: 8, name: "Jhon", age: 33 }, role: { codeRole: 'ADM', label: 'Administrator' }, group: { idGroup: 3, nomGroup: 'RH personnes' } }, { user: { idUser: 8, name: "Jhon", age: 33 }, role: { codeRole: 'GEST', label: 'RH Helper' }, group: { idGroup: 3, nomGroup: 'RH personnes' } }, ]; let newData = users.reduce((acc, curr) => { const isUserIncluded = acc.findIndex(item => curr.user.idUser === item.user.idUser && curr.role.codeRole === item.role.codeRole); if (isUserIncluded === -1) { const tempArray = []; tempArray.push(curr.group) acc.push({...curr, group: tempArray }) } else { acc[isUserIncluded].group.push(curr.group) } return acc; }, []); console.log(newData)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM