是否有任何关于如何处理以下extend
案例的实现(或模式)? AFAIK在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;
}
答案 0 :(得分:3)
是的,我猜,_.extend
和_.defaults
都没有解决您的问题,我的Angular-Fu也不足以在那里发表评论。
但是,看起来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);
希望能回答你的问题。
答案 1 :(得分:1)
AngularJS有一个简单的扩展函数:
angular.extend(target, source);
http://docs.angularjs.org/api/angular.extend
但是你应该知道该函数只将源的属性复制到目标并覆盖已经存在的所有内容。