我遇到了ES6中的String interpolation功能。如果我在代码中定义原始字符串,它就有效。但我想从文件中读取原始字符串,然后替换占位符。怎么做?
file.txt的
hello ${customer.name}
节点JS
var customer = {name: 'sid'};
var data = fs.readFileSync("file.txt","utf8");
// what should go here so that data is 'Hello sid'?
答案 0 :(得分:3)
唯一的方法是escape
文件中的模板字符串并稍后生成eval
,有关详细信息,请参阅this question。
答案 1 :(得分:3)
您可以构建单行而不是加载模板引擎。这将使用来自对象的值替换$ {field}。
var obj = {a: 'one', b: 'two'};
var templ = '${a}, ${b}';
templ.replace(/\${([^}]*)}/g, (r,k)=>obj[k]);
// 'one, two'
答案 2 :(得分:2)
我决定选择es6-template-strings
,因为它似乎很直接。 Petr的使用eval
的建议也有效,但我对项目使用eval
有一些限制
var data = fs.readFileSync("file.txt","utf8");
var compiled = compile(data);
var content = resolveToString(compiled, customer);
答案 3 :(得分:0)
从@John Williams 的帖子中汲取了很多灵感,您仍然可以通过向 regex-replace 添加拆分和化简器来在一行中完成此操作,以便您可以使用嵌套对象。
var obj = {a: 'one', b:{b1:"Bravo-1",b2:'Bravo-2'},c:{c1:{c2:"Charlie-2"}}};
var templ = '${a}, ${b.b1}, ${b.b2}, ${c.c1.c2}';
console.log(templ.replace(/\${([^}]*)}/g, (r,k)=>k.split(".").reduce((acc,cur)=>acc[cur],obj)));