为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣染霜花 2022-07-21 22:08:03
我有一个这样的对象数组: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'    }]},];我试过减少,但我找不到怎么做?感谢您的帮助
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

尝试如下。

内部减少功能。

  1. 查找您的组键是否已存在于结果对象中。

  2. 如果不存在,则创建新对象并添加到返回对象。

  3. 将当前对象的组添加到分组对象

  4. 返回结果对象

注意: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);


查看完整回答
反对 回复 2022-07-21
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

使用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)


查看完整回答
反对 回复 2022-07-21
  • 2 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号