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 函数。

  1. 查找您的组密钥是否已存在于结果对象中。
  2. 如果不存在则创建新对象并添加到 return 对象。
  3. 将当前对象的组添加到已分组的对象
  4. 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 查找累加器中是否存在具有相同 idUsercodeRole 的对象。如果存在,则更新 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)