javascript将方法参数插入到字符串模板中

时间:2011-09-14 05:09:45

标签: javascript templates replace

我不确定最终的实现方式,但基本要点是将方法参数插入字符串“template”。第一个例子,我可以做一个正则表达式替换但是有一些垮台,如果有必要,我愿意接受。第二个有点困难。如何从模板中获取名称并使用匹配的传递对象替换?谢谢你的帮助。

var myTemplate = 'Hello {name}'; // or something similar
var name = 'Bob';
function applyTemplate(tpl,str) {
    //do stuff here to replace {name} with passed argument
}
var newStr = applyTemplate(myTemplate,name); //should return 'Hello Bob'

//Also this one
var myTemplate = 'Good {timeOfDay} {name}';

function applyTemplate(tpl,o) {
    //simple objects only, don't need nested
}
var newStr = applyTemplate(myTemplate,{name:'Bob',timeOfDay:'morning'}); //should return 'Good morning Bob'

1 个答案:

答案 0 :(得分:1)

如果您不需要额外的检查和验证,则只需将{key}替换为value,例如:

function applyTemplate(tpl,o) {
    for(var key in o)
        {
            if(o.hasOwnProperty(key))// prevent iteration on any prototype inherited methods
                tpl = tpl.replace('{'+key+'}',o[key]);
        }
    return tpl;
}

至于你简单的第一个applyTemplate函数,因为你没有任何关于密钥应该是什么的概念,你可以使用正则表达式来替换遇到的第一个{...}

 function applyTemplate(tpl,str) {
     return tpl.replace(/{.*?}/,str);
}

然后,当然,您可以将这两个函数合二为一,根据参数的类型略有不同的功能:

 function applyTemplate(tpl,o) {
    switch(typeof o){
        case 'object' : 
            for(var key in o)
                {
                    if(o.hasOwnProperty(key))
                        tpl = tpl.replace('{'+key+'}',o[key]);
                }
            break;
        case 'string' : 
           tpl = tpl.replace(/{.*?}/,o);
           break;
        default : 
            throw new Error('no valid parameters supplied');
    }
    return tpl;
}

这应该可以解决问题。如果您有兴趣,可以在jquery模板系统中取得高峰:http://api.jquery.com/jQuery.template/

希望这会有所帮助。