Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态构建复杂对象_Javascript_Arrays_Object_Foreach - Fatal编程技术网

Javascript 动态构建复杂对象

Javascript 动态构建复杂对象,javascript,arrays,object,foreach,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 = {

这将根据每个用户的角色而有所不同。我希望构建一个如下所示的对象:

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']
    }
  };
我在一个名为roles的列表中循环,该列表中包含像
state\u tool\u subTool
这样的字符串

我希望它没有复制品。例如,如果在循环中运行的下一个用户角色上面的对象是NY_build_approve,我只想将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);
    }
  });
roles=['NY_email_submit'、'NY_email_approve'、'NY_build_submit'、'NY_build_view'、'DC_email_submit']
让权限={};
roles.forEach(role=>{
角色=角色.拆分(“”“);
let state=role[0];
让工具=角色[1];
让subTool=角色[2];
如果(!权限[状态]{
权限[状态]={[工具]:[子工具]};
}否则{
如果(权限[状态][工具]){
如果(!permissions[state][tool].includes(subTool)){
权限[状态][工具]=[…权限[状态][工具],子工具];
}
}
否则{
权限[状态][工具]=[子工具];
}
}
});
console.log(权限)
roles=['NY_email_submit'、'NY_email_approve'、'NY_build_submit'、'NY_build_view'、'DC_email_submit']
让权限={};
roles.forEach(role=>{
角色=角色.拆分(“”“);
let state=role[0];
让工具=角色[1];
让subTool=角色[2];
如果(!权限[状态]{
权限[状态]={[工具]:[子工具]};
}否则{
如果(权限[状态][工具]){
如果(!permissions[state][tool].includes(subTool)){
权限[状态][工具]=[…权限[状态][工具],子工具];
}
}
否则{
权限[状态][工具]=[子工具];
}
}
});

console.log(权限)这应该可以做到!你在正确的轨道上,只是需要另一层检查

let权限={};
角色=['NY_email_submit'、'NY_email_approve'、'NY_build_submit'、'NY_build_view'、'DC_email_submit'];
roles.forEach(role=>{
let[state、tool、subTool]=角色拆分(“”);
如果(权限中的状态){
if(工具处于权限[状态]){
权限[状态][工具].推送(子工具)
}否则{
权限[状态][工具]=[子工具]
}
}否则{
权限[状态]={[工具]:[子工具]}
}
});

console.log(权限)这应该可以做到!你在正确的轨道上,只是需要另一层检查

let权限={};
角色=['NY_email_submit'、'NY_email_approve'、'NY_build_submit'、'NY_build_view'、'DC_email_submit'];
roles.forEach(role=>{
let[state、tool、subTool]=角色拆分(“”);
如果(权限中的状态){
if(工具处于权限[状态]){
权限[状态][工具].推送(子工具)
}否则{
权限[状态][工具]=[子工具]
}
}否则{
权限[状态]={[工具]:[子工具]}
}
});

console.log(权限)这里是使用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)=>{
如果(!acc[curr[0]])acc[curr[0]={…acc[curr[0]],[curr[1]]:[…[curr[2]]}
否则{
如果(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]]}
}
返回acc
},{})

log(sp)
这里是使用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)=>{
如果(!acc[curr[0]])acc[curr[0]={…acc[curr[0]],[curr[1]]:[…[curr[2]]}
否则{
如果(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]]}
}
返回acc
},{})

console.log(sp)
您能为我们提供更多的测试输入吗?@AJFerron I添加了创建该示例对象的列表。如果您需要更多,我将提供您是否可以提供更多的测试输入?@AJFerron我添加了创建该示例对象的列表。如果你需要更多,我会提供