22

いくつかのプロパティを再帰的に拡張したいと思います (別名、ディープ コピー)。jQuery とよく似ています。私はjqueryだけを含めていません。

jQuery.extend( true, target, object1 )

シンプルなjavascriptまたはangularjsでそれを行うエレガントな方法はありますか?

アップデート を見て、同じ結果を達成してみてください http://plnkr.co/edit/GHabYbyhsqtfBPtplksO?p=preview

.copy() を調べましたが、「(オブジェクトの) プロパティが削除されました」

4

6 に答える 6

28

これは angular.extend 関数に基づいた extendDeep 関数です。これを $scope に追加すると、呼び出すことができます

$scope.meta = $scope.extendDeep(ajaxResponse1.myMeta, ajaxResponse2.defaultMeta);

探している答えを得ることができます。

$scope.extendDeep = function extendDeep(dst) {
  angular.forEach(arguments, function(obj) {
    if (obj !== dst) {
      angular.forEach(obj, function(value, key) {
        if (dst[key] && dst[key].constructor && dst[key].constructor === Object) {
          extendDeep(dst[key], value);
        } else {
          dst[key] = value;
        }     
      });   
    }
  });
  return dst;
};

注: この関数には、後の引数から前の引数に値をコピーするという副作用があります。この副作用を簡単に修正するには、に変更できdst[key] = valueますdst[key] = angular.copy(value)

于 2013-03-09T14:34:24.203 に答える
7
function deepExtend(destination, source) {
  for (var property in source) {
    if (source[property] && source[property].constructor &&
     source[property].constructor === Object) {
      destination[property] = destination[property] || {};
      arguments.callee(destination[property], source[property]);
    } else {
      destination[property] = source[property];
    }
  }
  return destination;
}

プランカー

ソース: https://gist.github.com/gregdangelo/2343158

于 2013-03-09T14:29:36.207 に答える
1

Ryan のコードに基づいて構築すると、オブジェクト チェックを短縮できます。また、オブジェクト ポインターをオーバーライドしないように関数を拡張しないでください。

var extendDeep = function extendDeep(dst) {
    angular.forEach(arguments, function(obj) {
        if (obj !== dst) {
            angular.forEach(obj, function(value, key) {
                if (dst[key] && angular.isObject(dst[key])) {
                    extendDeep(dst[key], value);
                } else if(!angular.isFunction(dst[key])) {
                    dst[key] = value;
                }
            });
        }
    });
    return dst;
};
于 2014-11-10T15:47:16.457 に答える
-1

Angular には copy メソッドがあります。

angular.copy

于 2013-03-09T13:05:39.817 に答える