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

时间:2015-07-30 16:07:35

标签: javascript json string-interpolation underscore.js-templating

我想做以下

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我可以实现我想要的东西,但我想知道是否有其他解决方案供将来参考,因为我很难找到下划线-plp第一名。

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

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

我使用JSON.parse(...)解析此consig.json,并使用文件中声明的require("child_process").spawncommandargs参数调用options,但{ {1}}更改了很多,添加了标记,重新排序和填充了内容,所以简单地执行args涉及更改调用config.task1.args[1] = "<input value>";的代码,这很容易出错。

更新

基于the accepted answer我创建了一个简单的包(located here),我可以将其包含在我的项目中,随时使用它。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

我建议您使用一个非常简单但非常快且可理解的模板引擎: simple-template.js

它由22行代码组成,非常简单! 考虑到这一点,您将能够轻松渲染您的配置!