在Angular中比较对象
在Angular中比较对象
在Angular中是否可以对两个对象进行“深度”比较?我想要做的是比较每个键/值对。例如:\n对象1\n
{ key1: "value1", key2: "value2", key3: "value3" }
\n对象2\n
{ key1: "value1", key2: "newvalue", key3: "value3" }
\n我需要进行比较,因为只有一个键/值对是不同的,所以比较失败。换句话说,所有的键/值对必须完全匹配,否则就会失败。这是否已经内置在Angular中。我相信如果我真的需要的话,我可以编写自己的服务,但我希望它已经内置了。类似于angular.equals。
问题的原因是,当使用angular.equals对包含"$"前缀的成员进行比较时,其行为会有所不同。在比较过程中,会忽略函数类型的属性和以"$"开头的属性。
解决方法是,根据Angular的官方文档,可以使用自定义的比较函数来处理包含"$"前缀的成员。这样可以确保在比较过程中不会忽略这些属性。
以下是一个示例代码,演示了如何使用自定义的比较函数来比较包含"$"前缀的成员:
var obj3 = {}; obj3.a = "b"; obj3.b = {}; obj3.b.$c = true; var obj4 = {}; obj4.a = "b"; obj4.b = {}; obj4.b.$c = true; function customEquals(obj1, obj2) { // 自定义比较函数 if (obj1 === obj2) { return true; } if (typeof obj1 !== typeof obj2) { return false; } if (typeof obj1 === "object") { var keys1 = Object.keys(obj1); var keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) { return false; } for (var i = 0; i < keys1.length; i++) { var key = keys1[i]; if (!obj2.hasOwnProperty(key)) { return false; } if (key.startsWith("$")) { if (obj1[key] !== obj2[key]) { return false; } } else { if (!customEquals(obj1[key], obj2[key])) { return false; } } } return true; } return false; } customEquals(obj3, obj4);
通过使用customEquals函数,可以确保在比较过程中不会忽略包含"$"前缀的成员。
从上述内容可以得出问题的出现原因是:当比较两个对象时,如果对象的属性顺序不同,则使用JSON.stringify方法进行比较会得到不正确的结果。因此,需要找到一种方法来解决这个问题。
解决方法:
1. 使用JSON.stringify方法对两个对象进行转换为字符串后再进行比较,可以得到正确的结果。代码如下:
JSON.stringify(obj1) == JSON.stringify(obj2);
2. 使用angular.equals方法进行比较,该方法不依赖于属性的顺序,并且是深层次递归比较。具体使用方法可以参考code.angularjs.org/1.2.0/docs/api/angular.equals。代码如下:
angular.equals(obj1, obj2);
3. 使用angular.toJson方法可以去除对象中的$$hashKeys属性。代码如下:
angular.toJson(obj);
通过使用上述方法可以解决在Angular中比较对象时属性顺序不同导致的问题。
在Angular中比较两个对象的方法是使用angular.equals(obj1, obj2)
。这个方法会进行深度比较,不依赖于键的顺序。例如,对于以下两个对象:
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)
以上的比较会返回true。
需要注意的是,angular.equals
方法测试的是对象的身份(identity),而不是相等性(equality)。比如,angular.equals( { id: "12" }, { id: 12 } )
会返回false。
angular.equals
方法基于对象的身份或深度相等性来返回true。具体来说,只要以下条件之一为真,两个对象或值就被认为是等价的:
- 对象的身份相同
- 对象的所有属性和属性值都相等
如果需要在返回false时找到两个对象的差异,可以参考这个链接:stackoverflow.com/questions/264430/...
另外需要注意的是,angular.equals()
方法会忽略以"$"开头的属性和属性值为函数的属性。
如果需要复制对象来跟踪状态,可以使用angular.copy()
方法来获得独立的obj1
和obj2
。