javascript嵌套模板字符串

时间:2019-06-14 15:35:25

标签: javascript string templates

在javascript中,假定一些类似于以下数据的定义:

y='${z}' 
z='hi' // y and z can be constants, or read from file, or ...
x=`===${y}===`

是否可以编写一个以“ x”等于“ === hi ===“而不是“ === $ {z} ===””结尾的“简单” javascript代码?

(注意,找到目标结果的步骤是“ === $ {y} ===” =>“ === $ {z} ===” =>“ === hi ===” )。

也就是说,是否可以在“循环”中使用模板字符串的行为(用k值替换$ {k}),直到不再有$ {}替换结果字符串为止?

更好的解决方案是允许数据存储在地图中而不是当前上下文中。也就是说,从

开始
data = { x : '===${y}===', y: '${y}', z='hi' }

通话:

myFunction(data, 'x') 

应返回'=== hi ==='。

1 个答案:

答案 0 :(得分:1)

可以使用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");