[英]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.