angular.extend深拷贝(deep copy)

在用到angular.extend的时候,正好碰到一个对象,是层层嵌套的Array, 结果发现只能extend第一层,查阅官文档,确实不支持deep copy: Note: Keep in mind that angular.extend does not support recursive merge (deep copy).

在stackoverflow找到一个方案,只是好像没什么用,看了一下他的写法,原来是在自行判断是否应该进入下一层递归,因为深拷贝的原始需求就是拷贝到最底层的每一个字段,同时angular本身就有判断是否对象和数组的扩展方法,于是改成如下:

var extendDeep = function(dst) {
  angular.forEach(arguments, function(obj) {
    if (obj !== dst) {
      angular.forEach(obj, function(value, key) {
        if(angular.isObject(dst[key]) || angular.isArray(dst[key])){
          extendDeep(dst[key], value);
        } else {
          dst[key] = angular.copy(value);
        }     
      });   
    }
  });
  return dst;
};

当然,你还可以更加丰富我的’angular.isObject(dst[key]) || angular.isArray(dst[key])’这一句判断.

演示1:
做了一个对象,含有a,b,c三个字段,其中C里面又包含了几个字段,并且还有一个数组;
同时再做一个用来extend的对象,其中的C字段只有上一个对象的部分内容
测试结果自己见演示, 可见,不管C多复杂,原生的angular.extend都只是直接把整个C元素替换掉了原始的C原素,根本没有进到哪怕第一层去.

演示2:
将上述extendDeep用上去,两个对象完美合并

posted @ 2014-11-05 17:46  $walker  阅读(3635)  评论(0编辑  收藏  举报