Подстановка переменных внутри строки - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь придумать какой-нибудь очень многократно используемый код, который будет искать и выполнять подстановку переменных внутри строки.

В приведенном ниже примере строки содержится ссылка $$ на переменную. Формат varname.key.

Я хочу, чтобы функция subText() была многоразовой. У меня проблема в том, что repvars сами могут потребовать замены. Код не закончил замену текста примера, и я прошу его заменить repvars.cr, вызвав ту же функцию. Это, кажется, через это выключено. Я говорю это, потому что, если я делаю это отдельно в работах.

var exampleText = "A string of unlimited length with various variable substitutions included $$repvars.cr$$";
    var repvars = {
        cr: 'Copyright for this is $$repvars.year$$',
        year: '2019'
    }

function subText(text) {
    var subVars = findSubs(text);
    return makeSubs(text, subVars);
}

function findSubs(theText) {
    var subarr = [];
    while (theText.indexOf('$$') > -1) {
        theText = theText.substring(theText.indexOf('$$') + 2);
        subarr.push(theText.substring(0, theText.indexOf('$$')));
        theText = theText.substring(theText.indexOf('$$') + 2);
    }
    return subarr;
}

function makeSubs(text, subs) {
    for (var s = 0; s < subs.length; s++) {
        var subst = getSubVal(subs[s]);
        text = text.split("$$" + subs[s] + "$$").join(subst);
    }
    return text;
}

function getSubVal(subvar) {
    var subspl = subvar.split('.');
    switch (subspl[0]) {
        default:
            return processRepVar(subspl[1]);
    }
}

function processRepVar(rvName) {
    var data = getRepVarData(rvName);
 if(data.indexOf('$$') > -1) {
   subText(data);
 } else {
  return data; 
 }
}

function getRepVars() {
    return repvars;
}

function getRepVarData(key) {
    return getRepVars()[key];
}

subText(exampleText);

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Вы пробовали регулярные выражения для этого?

function replace(str, data) {
  let re = /\$\$(\w+)\$\$/g;
  
  while (re.test(str))
    str = str.replace(re, (_, w) => data[w]);
    
  return str;
}

//

var exampleText = "A string with variables $$cr$$";

var repvars = {
  cr: 'Copyright for this is $$year$$',
  year: '2019'
}

console.log(replace(exampleText, repvars))

По сути, это многократно заменяет $$...$$ вещи в строке, пока их больше нет.

2 голосов
/ 07 октября 2019

Разве вы просто не пропустили return здесь?

function processRepVar(rvName) {
    var data = getRepVarData(rvName);
 if(data.indexOf('$$') > -1) {
   subText(data);
 } else {
  return data; 
 }
}

Изменение subText(data) на return subText(data); заставляет ваш код работать на меня.

Рабочая jsfiddle: https://jsfiddle.net/uzxno754/

...