【问题标题】:jQuery object equalityjQuery 对象相等
【发布时间】:2011-03-11 18:08:34
【问题描述】:

如何判断两个 jQuery 对象是否相等?我希望能够在数组中搜索特定的 jQuery 对象。

$.inArray(jqobj, my_array);//-1    
alert($("#deviceTypeRoot") == $("#deviceTypeRoot"));//False
alert($("#deviceTypeRoot") === $("#deviceTypeRoot"));//False

【问题讨论】:

    标签: equality jquery


    【解决方案1】:

    从 jQuery 1.6 开始,您可以使用.is。以下是一年多前的答案...

    var a = $('#foo');
    var b = a;
    
    
    if (a.is(b)) {
        // the same object!
    }
    

    如果要查看两个变量是否实际上是同一个对象,例如:

    var a = $('#foo');
    var b = a;
    

    ...然后您可以检查他们的唯一 ID。每次你创建一个新的 jQuery 对象时,它都会得到一个 id。

    if ($.data(a) == $.data(b)) {
        // the same object!
    }
    

    不过,同样可以通过简单的a === b 来实现,以上内容至少可以向下一个开发人员展示您正在测试的内容。

    无论如何,这可能不是您所追求的。如果你想检查两个不同的 jQuery 对象是否包含相同的元素集,你可以使用这个:

    $.fn.equals = function(compareTo) {
      if (!compareTo || this.length != compareTo.length) {
        return false;
      }
      for (var i = 0; i < this.length; ++i) {
        if (this[i] !== compareTo[i]) {
          return false;
        }
      }
      return true;
    };
    

    Source

    var a = $('p');
    var b = $('p');
    if (a.equals(b)) {
        // same set
    }
    

    【讨论】:

    • 当只有一个元素时,此解决方案简化为thephpdeveloper 给出的解决方案。可以认为 jQuery 对象相等的另一种意义是它们是否具有相同的选择器和上下文。这很容易测试:A.selector === B.selector &amp;&amp; A.context === B.context。通常上下文总是相同的,所以我们只需要考虑选择器。
    • @Casebash - true,但是考虑到多个选择器可能最终得到相同的结果集,例如:$(':first')$('*:first')
    • 注意@rampion 和 nickf,jQuery is() 不检查选择器是否相同,只是检查它们是否重叠。见证人:jsfiddle.net/bnhkm/1
    • 您的 equals 函数似乎对顺序敏感。像stackoverflow.com/a/29648479 这样的东西会在更多情况下起作用,尽管它会更慢。
    • 问题是关于 jquery 对象,而不是一般的对象。
    【解决方案2】:

    如果还是不知道,可以通过以下方式取回原来的对象:

    alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True
    alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True
    

    因为$("#deviceTypeRoot") 还返回选择器已选择的对象数组。

    【讨论】:

    • 这两个警报将显示true,因为您正在比较DOM元素的引用,== vs ===会给您相同的结果(不需要类型强制,它们只是两个对象引用)
    • 你的第二个语句实际上是返回 True
    • 啊是的,这是真的。复制粘贴错误=D
    【解决方案3】:

    $.fn.equals(...) 解决方案可能是最简洁、最优雅的解决方案。

    我已经尝试过这样的快速而肮脏的东西:

    JSON.stringify(a) == JSON.stringify(b)
    

    它可能很昂贵,但令人舒服的是它是隐式递归的,而优雅的解决方案不是。

    只要我的 2 美分。

    【讨论】:

    • 这不适用于检查两个 jQuery 对象之间的相等性,但适用于标准对象。比如“{a:'x',b:'y',c:'z'} == {a:'x',b:'y',c:'z'}”。我想知道没有 jQuery.isEqual(a, b)...
    • 这是错误的。对象属性的顺序很重要。因此,如果您有{a: 1, b: 2}{b: 2, a: 1},它将在应该返回true 时返回false
    • @EricAlberson,您对其他可以处理这种情况的深度比较工具或脚本有什么建议吗?
    【解决方案4】:

    一般来说,比较 $(foo) 和 $(foo) 是个坏主意,因为这在功能上等同于以下比较:

    <html>
    <head>
    <script language='javascript'>
        function foo(bar) {
            return ({ "object": bar });
        }
    
        $ = foo;
    
        if ( $("a") == $("a") ) {
            alert ("JS engine screw-up");
        }
        else {
            alert ("Expected result");
        }
    
    </script>
    
    </head>
    </html>
    

    当然,您永远不会想到“JS 引擎搞砸了”。我使用“$”只是为了说明 jQuery 在做什么。

    每当您调用 $("#foo") 时,您实际上是在执行一个 返回一个新对象的 jQuery("#foo")。所以比较它们并期望相同的对象是不正确的。

    但是你可以做的可能是这样的:

    <html>
    <head>
    <script language='javascript'>
        function foo(bar) {
            return ({ "object": bar });
        }
    
        $ = foo;
    
        if ( $("a").object == $("a").object ) {
            alert ("Yep! Now it works");
        }
        else {
            alert ("This should not happen");
        }
    
    </script>
    
    </head>
    </html>
    

    所以你真的应该在你的真实程序中比较 jQuery 对象的 ID 元素,比如

    ... 
    $(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")
    

    比较合适。

    【讨论】:

    • 明确一点,jQuery 没有对象属性。精灵王似乎将其用作伪代码
    【解决方案5】:

    使用 Underscore.js isEqual 方法http://underscorejs.org/#isEqual

    【讨论】:

      【解决方案6】:

      首先使用此函数根据键对对象进行排序

      function sortObject(o) {
          return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
      }
      

      然后,使用此函数比较对象的字符串化版本

      function isEqualObject(a,b){
          return JSON.stringify(sortObject(a)) == JSON.stringify(sortObject(b));
      }
      

      这是一个例子

      假设对象键的顺序不同并且具有相同的值

      var obj1 = {"hello":"hi","world":"earth"}
      var obj2 = {"world":"earth","hello":"hi"}
      
      isEqualObject(obj1,obj2);//returns true
      

      【讨论】:

        【解决方案7】:

        如果你想检查内容是否相等,那么只需使用 JSON.stringify(obj)

        例如 - var a ={key:val};

        var b ={key:val};

        JSON.stringify(a) == JSON.stringify(b) -----> 如果内容相同,则为真。

        【讨论】:

        • 你需要像 Kareem 的回答一样先对键进行排序
        猜你喜欢
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        相关资源
        最近更新 更多