比较 Angular 中的对象

Posted

技术标签:

【中文标题】比较 Angular 中的对象【英文标题】:Compare objects in Angular 【发布时间】:2013-12-22 23:12:19 【问题描述】:

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

对象 1


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

对象 2


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

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

【问题讨论】:

【参考方案1】:

我知道这有点晚了,但我只是为此损失了大约半小时的调试时间,这可能会节省一些时间。

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

例子:

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)

【讨论】:

【参考方案2】:

这个帖子有点晚了。 angular.equals 会进行深入检查,但是有谁知道如果其中一个成员在前缀中包含“$”,为什么它的行为会有所不同?

您可以通过以下输入尝试Demo

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);

【讨论】:

来自 Angular 文档:“在属性比较期间,函数类型的属性和名称以 $ 开头的属性将被忽略。” docs.angularjs.org/api/ng/function/angular.equals【参考方案3】:

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

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

【讨论】:

请注意 angular.equals 测试identity, not equality。 TL;DR:angular.equals( id: "12" , id: 12 ) // is false @bobjones angular.equals 基于身份或深度相等返回 true,因此您提出的示例将返回 true。请参阅angular.equals documentation,特别是如果以下至少一项为真,则两个对象或值被视为等效 @tommyTheHitMan:bobjones 示例返回 false,因为基于身份,"12"===12 // is false。试试看吧。 如果您需要一个 diff 对象来跟踪回滚历史,请参阅此...gist.github.com/katowulf/6193808 快速说明:当两个参数都是对象时,angular.equals() 会忽略所有以 $ 开头的属性,以及所有值为函数的属性。【参考方案4】:

假设两个对象中的顺序相同,只需 stringify 并比较它们!

JSON.stringify(obj1) == JSON.stringify(obj2);

【讨论】:

angular.equals(obj1,obj2) 也应该工作。它不依赖于键顺序并且很深(它被递归调用)code.angularjs.org/1.2.0/docs/api/angular.equals 那将是一个非常糟糕的假设! angular.toJson 也会删除 $$hashKeys

以上是关于比较 Angular 中的对象的主要内容,如果未能解决你的问题,请参考以下文章

$$hashKey 用于 angular2 中的对象?

迭代Angular中的对象[重复]

Angular - 错误:密码更改验证器中的对象可能为空

Angular:尝试与'[object Object]'进行比较时出错。仅允许数组和可迭代的对象

Angular 材质树中的对象数组

比较一个表中数组不同行的两个值Angular