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

Ways to interpolate template variables inside JavaScript objects

我想做以下事情

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

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

// res => {animal: "cat"}

magic 是一些做脏活的函数。显然 obj 可能会因多个键、嵌套数组等而更加复杂。模板变量可以在这样的数组中

var obj = {
  animals: ["cat", "dog", "${animal}", "cow"]
};

它可能位于数组中的任何位置,因此简单地执行 obj.animals[2] = "bat"; 是不可行的。

我找到了 underscore-tpl library 可以实现我想要的东西,但我想知道是否有其他解决方案供将来参考,因为我很难找到 underscore-tpl第一名。

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

{
  "task1": {
    "command": "command-line-program",
    "args": [
      "--input", "{{input}}",
      "--flag1",
      "--output", "{{output}}",
      "--flag2",
    ],
    "options": {
      "cwd": "path-to-working-dir"
    }
  }
}

我使用 JSON.parse(...) 解析此 consig.json,并使用在文件,但是 args 改变了很多,添加了标志,重新排序等等,所以简单地做 config.task1.args[1] = "<input value>"; 涉及更改调用 spawn 的代码,这很容易出错。

更新

基于 I've created a simple package (located here),我可以将其包含在我的项目中,请随意使用它。

您可以 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);
}

我向您推荐一个非常简单但非常快速且易于理解的模板引擎: simple-template.js

22行代码,非常简单! 考虑到这一点,您将能够轻松呈现您的配置!