javascript嵌套模板字符串
在javascript中,假设一些数据定义与以下定义类似:javascript嵌套模板字符串,javascript,string,templates,Javascript,String,Templates,在javascript中,假设一些数据定义与以下定义类似: y='${z}' z='hi' // y and z can be constants, or read from file, or ... x=`===${y}===` 是否可以编写一个“简单”的javascript代码,以“x”代替“=${z}==”,并等于“===hi==” (请注意,查找目标结果的步骤是“==${y}====”=>“===${z}=====”=>“===hi===”) 也就是说,模板字符串的行为(用k值替换$
y='${z}'
z='hi' // y and z can be constants, or read from file, or ...
x=`===${y}===`
是否可以编写一个“简单”的javascript代码,以“x”代替“=${z}==”,并等于“===hi==”
(请注意,查找目标结果的步骤是“==${y}====”=>“===${z}=====”=>“===hi===”)
也就是说,模板字符串的行为(用k值替换${k})是否可以在“循环”中使用,直到结果字符串中没有更多的${}可替换
如果解决方案允许数据存储在映射中而不是当前上下文中,则效果更好。就是从
data = { x : '===${y}===', y: '${y}', z='hi' }
电话:
myFunction(data, 'x')
应该返回“==hi===”。可以使用
eval
下面的代码显示了在全局上下文中执行此任务的方法
x = '===${y}===';
y = '${z}';
z = 'hi';
template = x;
result = x;
do {
template = result;
result = eval("`"+template+"`");
} while(result != template);
result;
在非全局上下文中,可以将函数创建为字符串并传递给eval
函数。下面的代码显示了如何执行此操作
let data = { x : '===${y}===', y: '${z}', z : 'hi' }
let myFunction = function(data, member) {
let env = ["(function() { \n"];
for(let prop in data){
env.push("\tlet ");
env.push(prop);
env.push(" = '");
env.push(data[prop]);
env.push("';\n");
}
let template = data[member]
let result = data[member];
do {
template = result;
env.push("\treturn `"+template+"`;\n");
env.push("})();");
result = eval(env.join(""));
env.pop();
env.pop();
} while(result!=template);
return result;
}
myFunction(data, "x");
当你说“递归”时,你能举个例子吗?像
===${${y}y}===
这样的字符串应该如何解释?如果将y='${z}'
设置为y=`${z}`
,就可以了。打印x
,它将打印预期的结果。@ggorlen:如果需要,我们可以假设在${}内只会出现一个有效的js标识符。然而,对于你提出的案例来说,最好的顺序是==${${y}y}====->=${${z}y}====->=${hiy}======->====@sjahan:我知道,我会澄清这个问题。关于将所有东西都放在同一个对象中,我怀疑你能做到这一点而不让事情变得可疑。