2017-02-04 45 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);