2017-01-06 70 views
0

我創建一些描述使用的我有特權名稱Regex JavaScript,這些是這些:遍歷內部對象對象與具有正則表達式

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's Developer Tool,打印一些VAR提供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(""); 


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

在控制檯上,我得到 「^ _ AP​​P $(*)。」 始終是一個字符串,當它應該是一個對象:

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 

我已經嘗試改變比較來檢查,如果實際roleReg是一個對象,但它並沒有改變任何東西。它是否有其他方式來迭代描述,在此之前檢查,如果實際的是一個對象?因爲,例如, 「^ A05 _(。*)」 是不是一個對象

+1

爲什麼你會想到它是一個對象?在你的代碼中,'roleReg'是對象的**鍵**之一;它不是您的代碼創建的正則表達式之一。變量'reg'包含RegExp實例,而不是'roleReg'。 – Pointy

+0

@Pointy我看到這裏> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects,它可能是一個對象,在myHonda VAR – mhery

+0

「myHonda」?什麼?對象屬性鍵總是字符串。 (當然,他們可以在ES2015符號實例,但這裏是不相關的。) – Pointy

回答

1

roleReg是屬性值(字符串),這是爲什麼。 reg是你用這個值創造的對象,那是一個對象。 ;)

澄清Object.keys(descriptions[baseReg][typeReg])正在迭代descriptions['NETWORK']['GROUP'],這會給你屬性名稱(字符串),而不是屬性的值。 var reg = RegExp(roleReg);用屬性NAME創建了一個正則表達式,它是^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(""); 


        }); 
       } 
      }); 
     } 
    }); 
}); 
+0

我看到現在,你必須改變(roleRegValue == Object.prototype.toString.call(roleRegValue)=== [對象的對象]「 )至(Object.prototype.toString.call(roleRegValue)=== [對象的對象]')裏面去了這一點,如果 – mhery

+1

我並沒有真正分析程序的其餘部分,因爲我不知道你是什麼試圖完成,但我認爲這足以讓你走了。很高興幫助你指出了正確的方向。 ;) –

+0

再次感謝很多 – mhery