2011-09-14 30 views
1

我不確定最終的實現將如何,但基本的方法是將方法參數插入字符串「模板」。第一個例子,我可以做一個正則表達式替換,但有一些倒臺,如果有必要,我願意接受。第二個是有點困難。我怎樣才能從模板中獲取名稱,並從傳遞的對象中替換匹配?謝謝你的幫助。javascript插入方法參數到字符串模板

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

如果你不需要額外的檢查&驗證,你可以只更換{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/

希望這有助於。

+0

太棒了!謝謝!我沒有意識到對象的hasOwnProperty()。我只是在javascript中查看反射。至於jQuery,SA選擇了它。從這裏滾動你自己! – kyle