在JavaScript对象中插入模板变量的方法

Koh*_*ert 7 javascript json string-interpolation underscore.js-templating

我想做以下事情

var obj = {
  animal: "${animal}"
};

var res = magic(obj, {animal: "cat"});

// res => {animal: "cat"}
Run Code Online (Sandbox Code Playgroud)

magic是一些做脏工作的功能.显然obj,使用多个键,嵌套数组等可能会更复杂.模板变量可以在这样的数组中

var obj = {
  animals: ["cat", "dog", "${animal}", "cow"]
};
Run Code Online (Sandbox Code Playgroud)

它可以在阵列中的任何地方,所以简单地做obj.animals[2] = "bat";是不可行的.

我找到了可以实现我想要的下划线tpl库,但我想知道是否有其他解决方案供将来参考,因为我很难找到下划线tpl.

我实际使用的情况是我有一个config.json文件,我有几个声明,如下所示

{
  "task1": {
    "command": "command-line-program",
    "args": [
      "--input", "{{input}}",
      "--flag1",
      "--output", "{{output}}",
      "--flag2",
    ],
    "options": {
      "cwd": "path-to-working-dir"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我用这个解析consig.json JSON.parse(...)我打电话require("child_process").spawncommand,argsoptions在文件中声明的参数,但是args改变了不少,标志添加,重新排序和东西,所以只做config.task1.args[1] = "<input value>";涉及改变调用的代码spawn,并因为它得到这是容易出错.

更新

基于已接受的答案,我创建了一个简单的包(位于此处),我可以将其包含在我的项目中,随时使用它.

dav*_*ave 2

您可以使用JSON.stringify该对象,然后将搜索值替换为实际值,然后是JSON.parse结果:

function magic(o, a) {
    var j = JSON.stringify(o);
    for (var k in a) {
            j = j.split('${'+k+'}').join(a[k]);
    }
    return JSON.parse(j);
}
Run Code Online (Sandbox Code Playgroud)