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

Is it possible to use regexp as object property?

本文关键字:对象 属性 regexp 可以使 是否      更新时间:2023-09-26

假设我有以下对象:

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');
   }
}

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

你可以这样做:

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

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

所以当你想再次使用属性名作为表达式时,你必须先"水合物"它:

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');
    }
});