是否可以使用regexp作为对象属性?

时间:2014-03-11 03:58:24

标签: javascript regex

假设我有以下对象:

var map = {};
map[/^\/e\/(?:([0-9a-f]{24}))\/rename\/?$/] = "/e/531e8942711f533cf0000019/rename";

上面的对象是将正则表达式映射到测试值。我需要做类似以下的事情:

for (var i in map) {
   if (map.hasOwnProperty(i) && i.test(map[i])) {
      console.log('It works');
   }
}

但上面的代码不起作用。怎么了?

2 个答案:

答案 0 :(得分:0)

你可以这样做:

var map = {};
map["^/e/(?:([0-9a-f]{24}))/rename/?$"] = "/e/531e8942711f533cf0000019/rename";

for (var i in map) {
   if (map.hasOwnProperty(i) && (new RegExp(i)).test(map[i])) {
      console.log('It works');
   }
}
// prints: It works

答案 1 :(得分:0)

是的,你可以;但是,有一点需要注意的是,正则表达式在被用作属性名称之前首先被转换为字符串。

因此,当您想再次使用属性名称作为表达式时,必须首先“重新水化”它:

for (var i in map) {
   if (map.hasOwnProperty(i)) {
       var re = eval(i);
       if (re.test(map[i])) {
         console.log('It works');
       }
   }
}

但是,我建议使用数组来阻止这种“神奇”的转换:

var map = [];
map.push([/^\/e\/(?:([0-9a-f]{24}))\/rename\/?$/, "/e/531e8942711f533cf0000019/rename"]);

map.forEach(function(info) {
    if (info[0].match(info[1])) {
       console.log('it works');
    }
});