Замена переменных в строке во время выполнения - PullRequest
0 голосов
/ 27 мая 2020

В настоящее время я использую следующее для оценки переменных, которые помещаются в строки во время выполнения:

newVal = eval("`" + newVal + "`");

Итак, если у меня есть строка:

"Hello from channel: ${erpVars["CommandChannel"]["name"]}"

И erpVars["CommandChannel"]["name"] имеет value home, тогда результирующая строка будет:

Hello from channel: home

Существуют и другие объекты, помимо erpVars, которые могут содержать совпадающие значения для строки, но это только один пример. Также важно отметить, что в каждой строке может быть несколько переменных, которые необходимо заменить.

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

1 Ответ

0 голосов
/ 30 мая 2020

Ваш случай звучит очень противно (вы никогда не должны использовать eval в JS! Это представляет серьезную угрозу безопасности! Также выглядит странно, что вы хотите заменить такую ​​строку) и, возможно, если бы вы мне сказали подробнее о том, откуда и в какой форме вы получаете свой вклад, тогда, возможно, мы вместе сможем найти гораздо лучшее решение для этого. В этой заметке я хотел бы решить вашу проблему в ее нынешнем виде следующим образом.

const newVal = 'Hello from channel: ${erpVars["CommandChannel"]["name"]}';

const strings = {
   erpVars: {
     CommandChannel: {
       name: "home"
     }
   }
};

const vars = newVal.match(/\$\{.+?\}/g);
let result = newVal;

vars.forEach(v => {
   let valuePath = '${erpVars["CommandChannel"]["name"]}'.match(/[\w\d]+/g).join('.');
   result = result.replace(v, _.get(strings, valuePath));
});

console.log(result);

enter image description here

Обратите внимание, что здесь я пропускаю край сценарий ios, например получение нулевого результата из newVal.match, когда в newVal нет переменных, но с этим легко справиться. Также обратите внимание, что здесь я использую библиотеку loda sh в _.get() (https://lodash.com/docs/4.17.15#get). Он очень популярен для такого рода небольших задач. Конечно, действительно есть много других инструментов, которые позволяют вам извлекать значение на основе пути свойства, такого как erpVars.CommandChannel.name, который хранится в переменной valuePath, включая безумное количество инструкций, которые говорят вам, как это сделать самостоятельно. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...