Replace string value with javascript object

前端 未结 4 516
清酒与你
清酒与你 2021-01-05 16:43

I am currently making a small module for NodeJs. For which I need a small help.

I will tell it like this. I have a variable with string. It contains a string html va

4条回答
  •  隐瞒了意图╮
    2021-01-05 17:19

    This solution uses template strings to do everything you want.

    This solution has the advantage that, in contrast to the naive roll-your-own regexp-based template replacement strategy as proposed in another answer, it supports arbitrary calculations, as in

    replacer("My name is ${name.toUpperCase()}", {name: "Bob"});
    

    In this version of replacer, we use new Function to create a function which takes the object properties as parameters, and returns the template passed in evaluated as a template string. Then we invoke that function with the values of the object properties.

    function replacer(template, obj) {
      var keys = Object.keys(obj);
      var func = Function(...keys, "return `" + template + "`;");
    
      return func(...keys.map(k => obj[k]));
    }
    

    We define the template using ${} for substitutions (instead of $()), but escaping as \${ to prevent evaluation. (We could also just specify it as a regular string literal, but would then lose multi-line capability).

    var html = `
    
    
      
      Document \${title}  
    
    
    
      

    Test file, \${text}

    `;

    Now things work exactly as you want:

    replacer(html, { "title" : "my title", "text" : "text is this" });
    

    Simple example:

    > replacer("My name is ${name}", {name: "Bob"})
    < "My name is Bob"
    

    Here's an example of calculated fields:

    > replacer("My name is ${name.toUpperCase()}", {name: "Bob"})
    < "My name is BOB"
    

    or even

    > replacer("My name is ${last ? lastName : firstName}", 
        {lastName: "Jones", firstName: "Bob", last: true})
    < "My name is Jones"
    

提交回复
热议问题