zoukankan      html  css  js  c++  java
  • 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用上去,两个对象完美合并

  • 相关阅读:
    python面向对象(一)
    ls和cd命令详解
    SHELL 中的变量
    Shell基础
    Python版飞机大战
    Python模块制作
    Linux的cut命令
    Linux中的wc命令
    Ubuntu系统下adb devices 不能显示手机设备
    app耗电量测试工具--PowerTutor
  • 原文地址:https://www.cnblogs.com/walkerwang/p/4076975.html
Copyright © 2011-2022 走看看