假设我有以下对象:
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');
}
}
但上面的代码不起作用。怎么了?
答案 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');
}
});