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用上去,兩個對象完美合並


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM