Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript嵌套模板字符串_Javascript_String_Templates - Fatal编程技术网

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值替换$

在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值替换${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:我知道,我会澄清这个问题。关于将所有东西都放在同一个对象中,我怀疑你能做到这一点而不让事情变得可疑。