猿问

从另一个按许多对象属性分组的对象返回数组

我有一个这样的对象数组:


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'    

}

},

];

我想返回这个由用户对象中的用户 id 和角色对象中的代码角色所摸索的对象数组,新的密钥组为每个 id 用户和代码角色都有一个组数组,如下所示:


 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'    

}]

},

];


我试过减少,但我找不到怎么做?


感谢您的帮助


白衣染霜花
浏览 115回答 2
2回答

慕斯709654

尝试如下。内部减少功能。查找您的组键是否已存在于结果对象中。如果不存在,则创建新对象并添加到返回对象。将当前对象的组添加到分组对象返回结果对象注意:reduce第二个参数是您的返回对象。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);

沧海一幻觉

使用reduce& findIndex。在 reduce 回调函数中,使用和findIndex查找累加器中是否存在任何对象。如果存在,则更新数组并从组中推送值。idUsercodeRolegroup如果它不存在,则创建新对象并将 的值推送到group数组中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)
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答