【问题标题】:Dynamically building a complex object动态构建复杂对象
【发布时间】:2020-07-09 20:32:57
【问题描述】:

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

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

【问题讨论】:

  • 您能提供更多的测试输入吗?
  • @AJFerron 我添加了将创建该示例对象的列表。如果您需要更多,我会提供

标签: javascript arrays object foreach


【解决方案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】:

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

    【讨论】:

      【解决方案3】:

      这是另一种使用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)

      【讨论】:

        猜你喜欢
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        • 2015-05-28
        相关资源
        最近更新 更多