码迷,mamicode.com
首页 > 其他好文 > 详细

angular.extend深拷贝(deep copy)

时间:2014-11-05 19:02:56      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:http   io   ar   for   sp   on   cti   bs   ef   

在用到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用上去,两个对象完美合并

angular.extend深拷贝(deep copy)

标签:http   io   ar   for   sp   on   cti   bs   ef   

原文地址:http://www.cnblogs.com/walkerwang/p/4076975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!