Динамическое строительство сложного объекта - PullRequest
0 голосов
/ 09 июля 2020

Это будет отличаться для каждого пользователя в зависимости от его роли. Я хочу создать объект, который может выглядеть так:

let permissions = {
    'state': {
        'tool': ['subTool1', 'subTool2']
    }
}

Пример:

roles = ['NY_email_submit', 'NY_email_approve', 'NY_build_submit', 'NY_build_view', 'DC_email_submit']

let permissions = {
    'NY': {
      'email': ['submit', 'approve'],
      'build': ['submit', 'view']
    },
    'DC': {
      'email': ['submit']
    }
  };

Я просматриваю список с именованными ролями, переданными в, который содержит сломанные строки вверх как state_tool_subTool.

Я бы хотел, чтобы у него не было дубликатов. Например, если следующая роль пользователя прошла через l oop с указанным выше объектом, это NY_build_approve, я хотел бы просто добавить утверждение в список по адресу ['build'].

В настоящее время у меня есть это который работает неправильно.

roles.forEach(role => {
    role = role.split('_');

    let state = role[0];
    let tool = role[1];
    let subTool = role[2];

    if ([state] in permissions) {
      permissions[state] = { [`${tool}`]: [subTool] };
    } else {
      //permissions[state][`${tool}`].push(subTool);
    }
  });

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Это должно сработать! Вы были на правильном пути, просто нужен был еще один уровень проверок

let permissions = {};
  
roles = ['NY_email_submit','NY_email_approve','NY_build_submit','NY_build_view', 'DC_email_submit'];

roles.forEach(role => {
    let [state, tool, subTool] = role.split('_');

    if (state in permissions) {
      if (tool in permissions[state]) {
        permissions[state][tool].push(subTool)

      } else {
        permissions[state][tool] = [subTool]
      }
      
    } else {
      permissions[state] = {[tool]: [subTool]}
    }
});

console.log(permissions);
1 голос
/ 09 июля 2020

roles = ['NY_email_submit', 'NY_email_approve', 'NY_build_submit', 'NY_build_view', 'DC_email_submit']

let permissions = {};

roles.forEach(role => {
    role = role.split('_');

    let state = role[0];
    let tool = role[1];
    let subTool = role[2];

    if (!permissions[state]) { 
      permissions[state] = {[tool] : [subTool]};
    } else {
        if (permissions[state][tool]) {
          if(!permissions[state][tool].includes(subTool)) {
            permissions[state][tool] = [...permissions[state][tool], subTool];
          }
        }
        else {
          permissions[state][tool] = [subTool];
        }
    }
  });
console.log(permissions);
0 голосов
/ 10 июля 2020

вот другой подход, использующий сокращение

roles = ['NY_email_submit', 'NY_email_approve', 'NY_build_submit', 'NY_build_view', 'DC_email_submit']
sp=roles.map(o=>o.split("_")).reduce((acc,curr)=>{
        if (!acc[curr[0]]) acc[curr[0]]={...acc[curr[0]],[curr[1]]:[...[curr[2]]]}
        else { 
          if(acc[curr[0]][curr[1]]) {         
          i=acc[curr[0]][curr[1]]
          acc[curr[0]]={...acc[curr[0]],[curr[1]]:[...i,...[curr[2]]]} }
          else  {acc[curr[0]]={...acc[curr[0]],[curr[1]]:[...[curr[2]]]} }

        }
         return acc
},{})
console.log(sp)
...