我对.replace()的工作方式有疑问
我知道我们可以在替换文本中使用子模式,如此
var somestr="foobar";
var newstr = somestr.replace(/foo([a-zA-Z]*)/g,"bar$1")
alert(newstr) //"barbar"
但是,我想知道是否甚至可以在对象属性中使用子模式,就像这样。
var somestr = "foobar";
var someobj = {bar:'fuu',two:'uuf'}
var newstr = somestr.replace(/foo([a-zA-Z]*)/g, someobj["$1"])
alert(newstr) //"fuu" ?
我的预期结果是获得'bar'
的{{1}}属性,即someobj
,但实际结果为"fuu"
,这会导致我相信这是不可能的。
我怎么能以其他方式完成类似的功能呢? 也许你们其中一位JS大师可以对此有所了解。
这背后的真实目的是我有一个模板系统,它使用短标签显示来自请求的JSON对象的数据片段,我试图简化的代码是谁。
答案 0 :(得分:4)
不是这样,我添加了1美元来显示失败:
var somestr = "foobar";
var someobj = {bar:'fuu',two:'uuf', $1: 'test'}
var newstr = somestr.replace(/foo([a-zA-Z]*)/g, someobj["$1"])
newstr; // "test";
但这可行:
var somestr = "foobar";
var someobj = {bar:'fuu',two:'uuf', $1: 'test'}
var newstr = somestr.replace(/foo([a-zA-Z]*)/g, "$1")
someobj[newstr]; // fuu
或者可能更好,替换需要一个功能:
var somestr = "foobar";
var someobj = {bar:'fuu',two:'uuf', $1: 'test'}
var newstr = somestr.replace(/foo([a-zA-Z]*)/g, function () {
return someobj[arguments[1]];
})
newstr; // fuu
答案 1 :(得分:0)
你可以这样做:
var someString = "foobar";
var someObject= {bar:'fuu',two:'uuf'};
var re = /foo([a-zA-Z]*)/g;
if (re.test(someString)) {
alert(someObject[RegExp.$1]);
}
请参阅此处的小提琴,http://jsfiddle.net/nickyt/AjjjP
你也可以这样做alert(someObject[someString.replace(/foo([a-zA-Z]*)/g, "$1")]);
,但问题是,如果在$ 1中找不到任何内容,你的对象会查找空字符串键。我会坚持上面的内容。