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