Строки являются неизменяемыми
Строки в 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]);
См. DEMO .
Шаблонные движки
В основном вы создаете свой собственный шаблонизатор.Если вы хотите использовать вместо этого готовое решение, рассмотрите возможность использования:
или что-то ещевот так.
Примером того, что вы пытаетесь сделать с помощью усов, будет:
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);
См. DEMO .