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