[英]return array of objects from another grouped by many object properties
我有一个这样的对象数组:
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'
}
},
];
我想返回这个由用户 object 的用户 id 和角色 object 的代码角色摸索的对象数组,新的密钥组具有每个 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'
}]
},
];
我试过减少,但我找不到怎么做?
感谢您的帮助
尝试如下。
内部减少 function。
注意: reduce
中的第二个参数是您的返回 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);
使用reduce
和findIndex
。 在 reduce 回调 function 中,使用findIndex
查找累加器中是否存在具有相同idUser
和 codeRole 的codeRole
。 如果存在,则更新group
数组并从组中推送值。
如果不存在,则创建新的 object 并将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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.