动态构建复杂对象

时间:2020-07-09 20:32:57

标签: javascript arrays object foreach

根据每个用户的角色,这将有所不同。我正在寻找一个看起来像这样的对象:

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之类的字符串。

我希望没有重复。例如,如果上一个对象的下一个用户角色是循环运行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 个答案:

答案 0 :(得分:1)

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);

答案 1 :(得分:1)

这应该可以解决问题!您走在正确的轨道上,只需要另一层检查

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);

答案 2 :(得分:0)

这是另一种使用reduce的方法

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)

相关问题