在Angular中比较对象

17 浏览
0 Comments

在Angular中比较对象

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

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

\n对象2\n

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

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

0
0 Comments

问题的原因是,当使用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函数,可以确保在比较过程中不会忽略包含"$"前缀的成员。

0
0 Comments

从上述内容可以得出问题的出现原因是:当比较两个对象时,如果对象的属性顺序不同,则使用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中比较对象时属性顺序不同导致的问题。

0
0 Comments

在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()方法来获得独立的obj1obj2

0