2

是否有关于如何处理以下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;
}
4

2 回答 2

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);

希望能回答你的问题。

于 2012-11-25T13:01:47.543 回答
1

AngularJS 有一个简单的扩展函数:

angular.extend(target, source);

http://docs.angularjs.org/api/angular.extend

但是您应该知道,该函数仅将源的属性复制到目标并覆盖已经存在的所有内容。

http://jsfiddle.net/flek/yhuDP/1/

于 2012-11-25T13:44:26.840 回答