比较Angular中的对象

sel*_*c82 78 angularjs

是否有可能对Angular中的两个对象进行"深度"比较?我想要做的是比较每个键/值对.例如:

对象1

{
   key1: "value1",
   key2: "value2",
   key3: "value3"
}
Run Code Online (Sandbox Code Playgroud)

对象2

{
   key1: "value1",
   key2: "newvalue",
   key3: "value3" 
}
Run Code Online (Sandbox Code Playgroud)

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

klo*_*ode 203

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

angular.equals(obj1, obj2)

它进行了深入的比较,并不依赖于键的顺序.请参阅AngularJS DOCS和一些Demo

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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,angular.equals测试[identity,**not**equality](http://stackoverflow.com/questions/5447024/javascript-comparison-operators-identity-vs-equality).TL; DR:`angular.equals({id:"12"},{id:12})//为false` (6认同)
  • @tommyTheHitMan:bobjones示例返回`false`,因为基于身份,"12"=== 12 //是假的.试一试吧. (5认同)
  • 快速说明:当两个参数都是对象时,angular.equals()忽略以$开头的所有属性,以及值为函数的所有属性. (4认同)

tym*_*eJV 23

假设两个对象中的顺序相同,只需将stringify它们进行比较即可!

JSON.stringify(obj1) == JSON.stringify(obj2);
Run Code Online (Sandbox Code Playgroud)

  • angular.equals(obj1,obj2)也应该有效.它不依赖于键顺序而且它很深(它被称为递归)http://code.angularjs.org/1.2.0/docs/api/angular.equals (14认同)
  • 那将是一个非常糟糕的假设! (3认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)

  • 从Angular文档:"在属性比较期间,函数类型的属性和名称以$开头的属性将被忽略." https://docs.angularjs.org/api/ng/function/angular.equals (4认同)