比较 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 中的对象的主要内容,如果未能解决你的问题,请参考以下文章