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我添加了创建该示例对象的列表。如果你需要更多,我会提供