2012-11-25 78 views
2

有沒有關於如何處理以下extend個案的任何實現(或模式)? AFAIK無法在Angular或Underscore中直接執行此操作,對嗎?嵌套對象擴展和跳過未定義的屬性(在Angular或Underscore中)

否則這裏是我的實現,但我想知道是否有任何已經完成或無論如何,知道您對我的代碼的反饋,謝謝!

http://jsbin.com/welcome/52916/edit

/**  
Extends the target object with the properties in the source object, with the following special handling: 

- it doesn't extend undefined properties, i.e. 
     target: { a: 10 } 
     source: { a: undefined } 
     result: { a: 10 } 

- it does nested extends rather than overwriting sub-objects, i.e. 
     target: { b: { i: 'Hi' } } 
     source: { b: { j: 'Bye' } } 
     result: { b: { i: 'Hi', j: 'Bye' } } 

*/ 
function extend(target, source) { 
    _.each(_.keys(source), function(k) { 
    if (angular.isDefined(source[k])) { 
     if (angular.isObject(source[k])) { 
     extend(definedOr(target[k], {}), source[k]); 
     } 
     else { 
     target[k] = source[k]; 
     } 
    } 
    }); 
    return target; 
} 

回答

3

是的,我想,無論是_.extend也不_.defaults解決您的問題,我的角福不夠好評論那裏。

但是,它看起來像jQuery.extend(true, target, source)解決了你的兩種使用情況。方法調用中的true進行了深度擴展,而extend方法已適用於您提到的undefined情況。

如果您需要更多的控制來解決源和目標對象之間的衝突,我總是發現Object.merge(target, source, deep:boolean, resolve:boolean|function)更靈活。如果您想知道這是一個來自庫名爲Sugar.js的方法。

爲了完整起見,可以像下面給出的Sugar.js方法一樣使用您的特定用例。

Object.merge(target, source, true, false); 

希望能回答你的問題。