文字列は不変です
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);
デモを参照してください。