jQuery对象相等

Cas*_*ash 146 jquery equality

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

$.inArray(jqobj, my_array);//-1    
alert($("#deviceTypeRoot") == $("#deviceTypeRoot"));//False
alert($("#deviceTypeRoot") === $("#deviceTypeRoot"));//False
Run Code Online (Sandbox Code Playgroud)

nic*_*ckf 219

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

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


if (a.is(b)) {
    // the same object!
}
Run Code Online (Sandbox Code Playgroud)

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

var a = $('#foo');
var b = a;
Run Code Online (Sandbox Code Playgroud)

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

if ($.data(a) == $.data(b)) {
    // the same object!
}
Run Code Online (Sandbox Code Playgroud)

虽然,通过一个简单的方法可以实现同样的目的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;
};
Run Code Online (Sandbox Code Playgroud)

资源

var a = $('p');
var b = $('p');
if (a.equals(b)) {
    // same set
}
Run Code Online (Sandbox Code Playgroud)

  • [较小的解决方案 - 使用`$(a).is(b)`](http://stackoverflow.com/q/2448362/9859). (7认同)
  • 注意@rampion和nickf,jQuery**是()不检查选择器是否相同**,只是它们重叠.证人:http://jsfiddle.net/bnhkm/1/ (3认同)
  • @Casebash - 是的,但是考虑到几个选择器最终可能会得到相同的结果集,例如:`$(':first')`和`$('*:first')` (2认同)

mau*_*ris 16

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

alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True
alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True
Run Code Online (Sandbox Code Playgroud)

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


小智 15

$.fn.equals(...)解决方案可能是最干净,最优雅的解决方案.

我尝试过这样快速和肮脏的东西:

JSON.stringify(a) == JSON.stringify(b)
Run Code Online (Sandbox Code Playgroud)

它可能很昂贵,但舒适的是它是隐式递归的,而优雅的解决方案却不是.

只需2美分.

  • 这是错的.对象属性的顺序很重要.因此,如果你有`{a:1,b:2}`和`{b:2,a:1}`这将返回`false`,它应该返回'true`. (12认同)
  • @EricAlberson,您对其他可以处理这种情况的深度比较工具或脚本有什么建议吗? (3认同)

小智 9

一般来说,将$(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>
Run Code Online (Sandbox Code Playgroud)

当然你永远不会指望"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>
Run Code Online (Sandbox Code Playgroud)

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

... 
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")
Run Code Online (Sandbox Code Playgroud)

更合适.


Kar*_*eem 6

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

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

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

function isEqualObject(a,b){
    return JSON.stringify(sortObject(a)) == JSON.stringify(sortObject(b));
}
Run Code Online (Sandbox Code Playgroud)

这是一个例子

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

var obj1 = {"hello":"hi","world":"earth"}
var obj2 = {"world":"earth","hello":"hi"}

isEqualObject(obj1,obj2);//returns true
Run Code Online (Sandbox Code Playgroud)