Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.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_Regex_String_Object - Fatal编程技术网

使用带有正则表达式的javascript迭代对象内部的对象

使用带有正则表达式的javascript迭代对象内部的对象,javascript,regex,string,object,Javascript,Regex,String,Object,我正在使用我拥有的特权的名称,用Regex创建一些描述,即: var privileges = [ "APP_SOMEONE_SRV", "APP_ANYONE_SRV", "ADM_AD_XX" ]; var descriptions = { "NETWORK": { "GROUP": { "^APP_(.*)$": { "^APP_" : "PATH",

我正在使用我拥有的特权的名称,用
Regex
创建一些描述,即:

var privileges = [
    "APP_SOMEONE_SRV",
    "APP_ANYONE_SRV",
    "ADM_AD_XX"
];

var descriptions = {
    "NETWORK": {
        "GROUP": {
            "^APP_(.*)$": {
                "^APP_" : "PATH",
                "^APP_A05_(.*)" : "$1",
                "_SRV" : "ON SERVER"
            },
            "^A05_(.*)" : "Group $1 at AD",
            "^ADM_AD_(.*)": "Administrator $1 at AD",       
        }
    }
}
我正在用Chrome的开发者工具调试代码,用window.console.log打印一些变量:

privileges.forEach(function(role) {
    var base = "NETWORK";
    var type = "GROUP";
    Object.keys(descriptions).forEach(function(baseReg) {
        if (base.match(new RegExp(baseReg))) {
            Object.keys(descriptions[baseReg]).forEach(function(typeReg) {
                if (type.match(new RegExp(typeReg))) {
                    Object.keys(descriptions[baseReg][typeReg]).forEach(function(roleReg) {

                    var reg = RegExp(roleReg);
                    window.console.log("role: " + role);
                    window.console.log("roleReg: " + typeof roleReg + " >> " + roleReg);
                    if (role.match(reg)) {
                        var suggestDescription = role.replace(reg, descriptions[baseReg][typeReg][roleReg]);
                        window.console.log("description: " + suggestDescription);    
                    }
                    if (roleReg == Object.prototype.toString.call(roleReg) === '[object Object]'){
                        window.console.log(roleReg + " is object");
                    }
                    window.console.log("");


                    });
                }
            });
        }
    });
});
在控制台上,我发现“^APP”(.*)”始终是一个字符串,而它应该是一个对象:

VM107:31 role: APP_SOMEONE_SRV
VM107:32 roleReg: string >> ^APP_(.*)$
VM107:35 description: [object Object]
VM107:40 
VM107:31 role: APP_SOMEONE_SRV
VM107:32 roleReg: string >> ^A05_(.*)
VM107:40 
VM107:31 role: APP_SOMEONE_SRV
VM107:32 roleReg: string >> ^ADM_AD_(.*)
VM107:40 
VM107:31 role: APP_ANYONE_SRV
VM107:32 roleReg: string >> ^APP_(.*)$
VM107:35 description: [object Object]
VM107:40 
VM107:31 role: APP_ANYONE_SRV
VM107:32 roleReg: string >> ^A05_(.*)
VM107:40 
VM107:31 role: APP_ANYONE_SRV
VM107:32 roleReg: string >> ^ADM_AD_(.*)
VM107:40 
VM107:31 role: ADM_AD_XX
VM107:32 roleReg: string >> ^APP_(.*)$
VM107:40 
VM107:31 role: ADM_AD_XX
VM107:32 roleReg: string >> ^A05_(.*)
VM107:40 
VM107:31 role: ADM_AD_XX
VM107:32 roleReg: string >> ^ADM_AD_(.*)
VM107:35 description: Administrator XX at AD

我已经尝试更改比较,以检查实际角色是否是对象,但它没有改变任何东西。它是否有其他方法来迭代描述,在此之前检查实际描述是否为对象?因为,例如,“^A05(.*)”不是对象

roleReg
是属性值(字符串),这就是原因
reg
是您使用该值创建的对象,它是一个对象。;)

为了澄清
Object.keys(descriptions[baseReg][typeReg])
正在迭代
descriptions['NETWORK']['GROUP']
,这将为您提供属性名称(字符串),而不是属性的值<代码>var reg=RegExp(roleReg)创建一个带有属性名的正则表达式,该属性名为
^APP(.*)$

descriptions[baseReg][typeReg][roleReg]
将提供您要查找的属性对象

试试这个:

privileges.forEach(function(role) {
    var base = "NETWORK";
    var type = "GROUP";
    Object.keys(descriptions).forEach(function(baseReg) {
        if (base.match(new RegExp(baseReg))) {
            Object.keys(descriptions[baseReg]).forEach(function(typeReg) {
                if (type.match(new RegExp(typeReg))) {
                    Object.keys(descriptions[baseReg][typeReg]).forEach(function(roleReg) {
                    var reg = RegExp(roleReg);
                    var roleRegValue = descriptions[baseReg][typeReg][roleReg];
                    window.console.log("role: " + role);
                    window.console.log("roleReg Property: " + typeof roleReg + " >> " + roleReg);
                    window.console.log("roleReg Value: " + typeof roleRegValue + " >> " + roleRegValue);
                    if (role.match(reg)) {
                        var suggestDescription = role.replace(reg, descriptions[baseReg][typeReg][roleReg]);
                        window.console.log("description: " + suggestDescription);    
                    }
                    if (roleRegValue == Object.prototype.toString.call(roleRegValue) === '[object Object]'){
                        window.console.log(roleRegValue + " is object");
                    }
                    window.console.log("");


                    });
                }
            });
        }
    });
});

你为什么期望它是一个物体?在代码中,
roleReg
是对象的键之一;它不是代码创建的正则表达式之一。变量
reg
包含RegExp实例,而不是
roleReg
@Pointy我在这里看到的>它可能是一个对象,在myHonda变量“myHonda”??什么?对象属性键始终是字符串。(好吧,它们可以是ES2015中的符号实例,但在这里并不相关。)我现在看到,如果我没有真正分析程序的其余部分,你必须将(roleRegValue==Object.prototype.toString.call(roleRegValue)===Object.prototype.toString.call(roleRegValue)===Object.toString.call(roleRegValue)===Object-Object-call)更改为(Object-Object-Object-Object-Object-call),因为我不确定你想完成什么,但我想这足以让你走了。很高兴它为你指明了正确的方向