return 来自另一个按许多对象属性分组的对象数组
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'
}
},
];
我想 return 这个对象数组通过用户对象的用户 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'
}]
},
];
我试过使用 reduce,但我找不到该怎么做?
感谢您的帮助
像下面这样尝试。
内部 reduce 函数。
- 查找您的组密钥是否已存在于结果对象中。
- 如果不存在则创建新对象并添加到 return 对象。
- 将当前对象的组添加到已分组的对象
- return 结果对象
注意:reduce
第二个参数是您的 return 对象。
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
查找累加器中是否存在具有相同 idUser
和 codeRole
的对象。如果存在,则更新 group
数组并从组中推送值。
如果不存在则创建新对象并将 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)
我有一个这样的对象数组:
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'
}
},
];
我想 return 这个对象数组通过用户对象的用户 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'
}]
},
];
我试过使用 reduce,但我找不到该怎么做?
感谢您的帮助
像下面这样尝试。
内部 reduce 函数。
- 查找您的组密钥是否已存在于结果对象中。
- 如果不存在则创建新对象并添加到 return 对象。
- 将当前对象的组添加到已分组的对象
- return 结果对象
注意:reduce
第二个参数是您的 return 对象。
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
查找累加器中是否存在具有相同 idUser
和 codeRole
的对象。如果存在,则更新 group
数组并从组中推送值。
如果不存在则创建新对象并将 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)