字符串是不可变的
JavaScript 中的字符串是不可变的。这意味着这永远不会像您期望的那样工作:
myString.replace(x, y);
alert(myString);
这不仅仅是一个问题.replace()
——在 JavaScript 中没有任何东西可以改变字符串。你可以做的是:
myString = myString.replace(x, y);
alert(myString);
正则表达式文字不插入值
JavaScript 中的正则表达式文字不会插入值,因此这仍然不起作用:
myString = myString.replace(/\{replaceArray[i]\}/gi, replaceWith[i]);
你必须这样做:
myString = myString.replace(new RegExp('\{'+replaceArray[i]+'\}', 'gi'), replaceWith[i]);
但这有点乱,所以你可以先创建一个正则表达式列表:
var regexes = replaceArray.map(function (string) {
return new RegExp('\{' + string + '\}', 'gi');
});
for(var i = 0; i < replaceArray.length; i ++) {
myString = myString.replace(regexes[i], replaceWith[i]);
}
如您所见,您还可以使用i < replaceArray.length
而不是i <= replaceArray.length - 1
来简化循环条件。
2017 年更新
现在你可以让它变得更简单:
var regexes = replaceArray.map(string => new RegExp(`\{${string}\}`, 'gi'));
for(var i = 0; i < replaceArray.length; i ++) {
myString = myString.replace(regexes[i], replaceWith[i]);
}
没有循环
而不是一遍又一遍地循环和应用.replace()
函数,你可以像这样只做一次:
var mapping = {};
replaceArray.forEach((e,i) => mapping[`{${e}}`] = replaceWith[i]);
myString = myString.replace(/\{\w+\}/ig, n => mapping[n]);
见演示。
模板引擎
您基本上是在创建自己的模板引擎。如果您想改用现成的解决方案,请考虑使用:
或类似的东西。
您尝试使用 Mustache 执行的操作的一个示例是:
var myString = "This is {{name}}'s {{adjective}} {{type}} in JavaScript! Yes, a {{type}}!";
var myData = {name: 'John', adjective: 'simple', type: 'string'};
myString = Mustache.to_html(myString, myData);
alert(myString);
见演示。