2012-10-16 34 views
3
/** Supplant **/ 
String.prototype.supplant = function(o) { 
    return this.replace (/{([^{}]*)}/g, 
     function (a, b) { 
      var r = o[b]; 
      return typeof r === 'string' || typeof r === 'number' ? r : a; 
     } 
    ); 
}; 

Crockford無疑是一個JavaScript大精靈,但他的原型缺乏涉及到多個級別的對象。Crockford的.supplant與多個級別的對象

我想這個函數覆蓋多個級別的對象替換,如'{post.detailed}'任何人都可以幫助我一個修訂版本取代?

+0

這應有助於:http://stackoverflow.com/questions/4343028/in-javascript-test-for-property-deeply-nested-in-object-graph –

回答

5

這應該不是太難。改用這個替換函數:

function (a, b) { 
    var r = o, 
     parts = b.split("."); 
    for (var i=0; r && i<parts.length; i++) 
     r = r[parts[i]]; 
    return typeof r === 'string' || typeof r === 'number' ? r : a; 
} 
+0

'suppplant'現已正式一個東西。去'npm install suppplant'或者在https://github.com/devotis/suppplant上發帖。謝謝@Bergi –

3

我個人討厭它,當人們在JavaScript中使用本機類型填充自己的垃圾時。如果我要寫它,我會做以下......但爲什麼不愛布爾?

function supplant(str, data) { 
    return str.replace(/{([^{}]*)}/g, function (a, b) { 

     // Split the variable into its dot notation parts 
     var p = b.split(/\./); 

     // The c variable becomes our cursor that will traverse the object 
     var c = data; 

     // Loop over the steps in the dot notation path 
     for(var i = 0; i < p.length; ++i) { 

      // If the key doesn't exist in the object do not process 
      // mirrors how the function worked for bad values 
      if(c[p[i]] == null) 
       return a; 

      // Move the cursor up to the next step 
      c = c[p[i]]; 
     } 

     // If the data is a string or number return it otherwise do 
     // not process, return the value it was, i.e. {x} 
     return typeof c === 'string' || typeof c === 'number' ? c : a; 
    }); 
}; 

它不支持數組btw,你需要做一些額外的東西來支持。

+1

你爲什麼認爲它不支持數組?只需使用'supplant(「{myArray.0}」,{myArray:[「foo」]})' – Bergi

+0

好的呼叫!當然它會做類型強制「0」=> 0 ... Duh。 –

+0

實際上,它沒有 - 屬性名稱總是字符串;對於Array對象也是如此。 – Bergi

1

@Bergi方法W布爾/支持:

function (a, b) { 
    var r = o, 
     parts = b.split("."); 
    for (var i=0; r && i<parts.length; i++) 
     r = r[parts[i]]; 
    return typeof r === 'string' || typeof r === 'number' || typeof r === 'boolean' ? r : a; 
} 

原始Crockford的取代方法W /支持布爾:

if (!String.prototype.supplant) { 
    String.prototype.supplant = function (o) { 
     return this.replace(/{([^{}]*)}/g, 
      function (a, b) { 
       var r = o[b]; 
       return typeof r === 'string' || typeof r === 'number' || typeof r === 'boolean' ? r : a; 
      } 
     ); 
    }; 
} 

祝您好運!

https://gist.github.com/fsschmitt/b48db17397499282ff8c36d73a36a8af

相關問題