Группировать объекты с одинаковым свойством - javascript - PullRequest
0 голосов
/ 15 мая 2018

У меня есть простой объект

var xobj = [
    { role:"Organize Admin", role_id:"id1", permission_name:"View All Users",active: "true" },
    { role:"Organize Admin", role_id:"id1", permission_name:"Create users", active: "true" },
    { role:"Organize Admin", role_id:"id1", permission_name:"Edit users", active: "true" },
    { role:"System Admin", role_id:"id2", permission_name:"Edit users", active: "true" },
    { role:"System Admin", role_id:"id2", permission_name:"Edit users", active: "true" },
];

Я борюсь за реструктуризацию объекта на основе role_id, группируя разрешения для каждого role_id

Я хочу что-то вроде этого

Как эффективный способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Еще один способ сделать это - использовать объект и накапливать контент в его свойствах

var xobj = [
    { role:"Organize Admin", role_id:"id1", permission_name:"View All Users",active: "true" },
    { role:"Organize Admin", role_id:"id1", permission_name:"Create users", active: "true" },
    { role:"Organize Admin", role_id:"id1", permission_name:"Edit users", active: "true" },
    { role:"System Admin", role_id:"id2", permission_name:"Edit users", active: "true" },
    { role:"System Admin", role_id:"id2", permission_name:"Edit users", active: "true" },
];
var groups = {};
xobj.forEach(obj => {	
    if(!groups.hasOwnProperty(obj.role_id)){
        groups[obj.role_id] = [];
    }
    groups[obj.role_id].push(obj);
})
console.log(groups)
0 голосов
/ 15 мая 2018

Используйте .reduce, чтобы сгруппировать объекты роли, и используйте .find внутри, чтобы найти соответствующий id объект в массиве аккумулятора (если он существует):

const input = [
  { role:"Organize Admin", role_id:"id1", permission_name:"View All Users",active: "true" },
  { role:"Organize Admin", role_id:"id1", permission_name:"Create users", active: "true" },
  { role:"Organize Admin", role_id:"id1", permission_name:"Edit users", active: "true" },
  { role:"System Admin", role_id:"id2", permission_name:"Edit users", active: "true" },
  { role:"System Admin", role_id:"id2", permission_name:"Edit users", active: "true" },
];
const roles = input.reduce((a, { role_id, permission_name: name, active }) => {
  const foundRole = a.find(({ id }) => id === role_id);
  if (foundRole) foundRole.permissions.push({ name, active });
  else a.push({ id: role_id, permissions: [{ name, active }] });
  return a;
}, []);
console.log(roles);
...