Javascript 角度深度比较对象(特定属性除外)

Javascript 角度深度比较对象(特定属性除外),javascript,angularjs,object,comparison,watch,Javascript,Angularjs,Object,Comparison,Watch,用例: $scope.$watch('settings', function (newVal, oldVal) { if (!angular.equals(oldVal, newVal)) { setDirty(); } }, true); 现在,这实际上与 $scope.$watch('settings', function (newVal, oldVal) { if (oldVal) { setDirty(); } }, true);

用例:

$scope.$watch('settings', function (newVal, oldVal) {
   if (!angular.equals(oldVal, newVal)) {
       setDirty();
    }
}, true);
现在,这实际上与

$scope.$watch('settings', function (newVal, oldVal) {
   if (oldVal) {
       setDirty();
    }
}, true);
因为
$watch
已经比较了两者

但是,有一个属性即使发生更改,我也不想
setDirty()

这是我目前正在使用的(黑客)解决方案:

$scope.$watch('settings', function (newVal, oldVal) {
   if (!oldVal) return;
   var editedOldVal = angular.copy(oldVal, {});
   var editedNewVal = angular.copy(newVal, {});
   delete editedOldVal.propertyIDontWannaWatch;
   delete editedNewVal.propertyIDontWannaWatch;
   if (!angular.equals(editedOldVal, editedNewVal)) {
       setDirty();
   }
}, true);
是否有更干净的方法使
angular.equals()
$watch
忽略特定属性

编辑:


没有解决我的问题,因为选项1根本不是一个解决方案,它说如果我不想看的属性没有更改-什么也不做,但这正是我想要忽略的属性(不管它是否更改)
选项2
使该属性根本不具有可比性,我只想在这个特定情况下忽略它,而不是使其定义为不可比。

您可以在属性前面加上$,它将不会包含在相等的比较中。angular.equals方法忽略以$开头的属性。

从Angular.js代码中:

if(key.charAt(0)=='$'| | isFunction(o1[key])继续

例如:
var object1={propertyOne:'1',$myCustomHiddenField:'something'}

var object2={propertyOne:'1',$myCustomHiddenField:'something'}

var result=angular.equals(object1,object2)//这是真的


equals方法可以被引用。

是否可能重复?lostintranslation不幸的是,没有,最终还是采用了黑客解决方案,其实也没那么糟糕。我也在努力解决同样的问题。这很有效。救了我一命,先生!