比较Angular中的对象


79

是否可以对Angular中的两个对象进行“深度”比较?我想做的是比较每个键/值对。例如:

对象1

{
   key1: "value1",
   key2: "value2",
   key3: "value3"
}

对象2

{
   key1: "value1",
   key2: "newvalue",
   key3: "value3" 
}

我需要的是比较失败,因为只有键/值对之一是不同的。换句话说,所有键/值对必须完全匹配,否则将失败。这是Angular中已经内置的东西吗?我确信如果确实需要,我可以编写自己的服务,但我希望它已经内置。类似于angular.equals。

Answers:


205

要比较两个对象,可以使用:

angular.equals(obj1, obj2)

它进行了深层比较,并且不依赖于键的顺序。请参阅AngularJS DOCS和一些演示

var obj1 = {
  key1: "value1",
  key2: "value2",
  key3: {a: "aa", b: "bb"}
}

var obj2 = {
  key2: "value2",
  key1: "value1",
  key3: {a: "aa", b: "bb"}
}

angular.equals(obj1, obj2) //<--- would return true

6
需要注意的是angular.equals测试的身份,不是平等的。TL; DR:angular.equals( { id: "12" }, { id: 12 } ) // is false
bobjones

@bobjones angular.equals基于身份或深度相等返回true,因此您提出的示例将返回true。请参阅angular.equals文档,特别是如果满足以下至少一项要求,则两个对象或值被视为等效
tommyTheHitMan 2014年

5
@tommyTheHitMan:bobjones示例返回,false因为基于身份"12"===12 // is false。尝试一下。
2014年

并且,如果您需要一个diff对象来跟踪回滚的历史记录,请参阅此... gist.github.com/katowulf/6193808
Mark

4
快速注意:当两个参数都是对象时,angular.equals()会忽略所有以$开头的属性以及所有值为函数的属性。
im1dermike '16


5

在这个线程上有点晚。angular.equals会进行深入检查,但是有人知道为什么如果成员之一在前缀中包含“ $”会导致其行为不同?

您可以 通过以下输入尝试此演示

var obj3 = {}
obj3.a=  "b";
obj3.b={};
obj3.b.$c =true;

var obj4 = {}
obj4.a=  "b";
obj4.b={};
obj4.b.$c =true;

angular.equals(obj3,obj4);

4
在Angular文档中:“在属性比较期间,将忽略函数类型的属性和名称以$开头的属性。” docs.angularjs.org/api/ng/function/angular.equals
sonicwizard 2015年

2

我知道这是有点晚了答案,但我只是失去了对这个一小时的调试原因的一半,这可能节约一些时间。

请注意,如果angular.equals()在具有属性obj.$something (属性名称以$开头)的对象上使用,则这些属性在比较中将被忽略。

例:

var obj1 = {
  $key0: "A",
  key1: "value1",
  key2: "value2",
  key3: {a: "aa", b: "bb"}
}

var obj2 = {
  $key0: "B"
  key2: "value2",
  key1: "value1",
  key3: {a: "aa", b: "bb"}
}

angular.equals(obj1, obj2) //<--- would return TRUE (despite it's not true)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.