【问题标题】:Compare objects in Angular比较 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。

【问题讨论】:

    标签: angularjs


    【解决方案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);
      

      【讨论】:

      【解决方案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);
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2014-07-28
      • 2010-10-07
      • 2018-11-03
      相关资源
      最近更新 更多