ES6 文件内容字符串插值

问题描述 投票:0回答:6

我遇到了 ES6 中的字符串插值功能。如果我在代码中定义原始字符串,它就会起作用。但我想从文件中读取原始字符串,然后替换占位符。怎么办?

文件.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'?
javascript node.js ecmascript-6
6个回答
14
投票

您可以构建一个单行代码而不是加载模板引擎。这会将 ${field} 替换为对象中的值。

var obj = {a: 'one', b: 'two'};
var templ = '${a}, ${b}';

templ.replace(/\${([^}]*)}/g, (r,k)=>obj[k]);

//  'one, two'

5
投票

我决定选择

es6-template-strings
,因为它看起来很简单。或者,handlebar也适用于复杂的表达式。Petr建议使用
eval
也有效,但我在我的项目中使用
eval
有一些限制

var data = fs.readFileSync("file.txt","utf8");
var compiled = compile(data);
var content = resolveToString(compiled, customer);

3
投票

唯一的方法是

escape
文件中的模板字符串并稍后制作
eval
,请参阅这个问题了解更多详细信息。


0
投票

从 @John Williams 的帖子中汲取了很多灵感,您仍然可以通过在正则表达式替换中添加拆分和缩减器来在一行中完成此操作,以便您可以使用嵌套对象。

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)));


0
投票

改进@Daniel 的解决方案,允许保留未定义的变量引用。这允许具有不同变量匹配的多个模板插值通道。

// Interpolate template given parameter object.
// Can be chained, replacing only found variable paths.
// Strip whitespace from template variable reference.
// Will not work with ${"some var"."another var"}
const replace = function (templ, obj) {
    return templ.replace(/\${([^}]*)}/g, (r,k)=> {
        let ret;
        try { ret = k.replace(/ /g, '').split(".").reduce((acc,cur)=>acc[cur],obj); } catch (err) { }
        return (ret === undefined) ? r : ret;
    });
};
var obj = {a: 'one', b:{b1:"Bravo-1",b2:'Bravo-2'},c:{c1:{c2:"Charlie-2"}}};
var templMissing = '${ a}, ${b.b1 }, ${b.b2}, ${c.c1.c2}, ${bla} ${var.ble}';
console.log(replace(templMissing, obj));


0
投票

参加聚会已经晚了,但我认为至少应该列出老式方法。 这假设您信任您的源文件。

const tpl = fs.readFileSync('./someTemplateFile.txt', 'utf8');

const tplPatt = /\${([\w.]+)}/g;

const msg = tpl.replace(tplPatt, function (a, m){
    return eval(m);
});
© www.soinside.com 2019 - 2024. All rights reserved.