2017-02-04 217 views
1

我有一个名为String的变量,其中有一个名为bar的标签。 var String = "Foo <Object.1>"和我有一个名为对象,var Object = {1:"Bar",2:"More Bar",3:"Even more Bar"}对象,现在我需要的标签Object.1获得通过,所以我结束了这样的替换:var String = "Foo Bar"用变量替换字符串变量名的子字符串

这里是渔获:我可能有多个(和不同的)标签在一个字符串中,我永远不会知道该字符串中有哪些标签和多少标签,并且对象内部可能有数百万个变量。

呼救, 卢卡

+0

我敢肯定'Object'已用于通用对象,我想你应该重命名你的变量。 – monnef

+0

由于'String'肯定:) – CharlieBrown

回答

2

你可以使用,在适当的变量名,为replacment对象,String#replace与在window对象和密钥的访问,从字符串取一个全局变量。

var string = "Foo <object.1>", 
 
    object = { 1: "Bar", 2: "More Bar", 3: "Even more Bar" }; 
 

 
string = string.replace(/<([^.]+)\.([^>]+)>/, function (_, v, k) { 
 
    return window[v][k]; 
 
}); 
 

 
console.log(string);

一种更好的方法,是存放零件为对象,并采取部分作为键,在不使用window对象。然后该对象也可以是本地的。

var string = "Foo <object.1>", 
 
    values = { object: { 1: "Bar", 2: "More Bar", 3: "Even more Bar" } }; 
 

 
string = string.replace(/<([^.]+)\.([^>]+)>/, function (_, k1, k2) { 
 
    return values[k1][k2]; 
 
}); 
 

 
console.log(string);

0

使用String.prototype.replace()功能的解决方案:

var str = "Foo <Object.1> some text, <Object.2> data, <Object.3> other", 
 
    values = {1:"Bar", 2:"More Bar", 3:"Even more Bar"}; 
 

 
str = str.replace(/<Object\.(\d+)>/g, function (m0, m1) { 
 
    return (values[m1])? values[m1] : m0; // replace if `Object` number exists as a key of predefined `values` object 
 
}); 
 

 
console.log(str);