2010-07-05 115 views
120

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

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

回答

186

由于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 
} 
+0

当只有一个元素时,此解决方案简化为[thephpdeveloper](http://stackoverflow.com/questions/3176962/jquery-object-equality/3176971#3176971)给出的解决方案。 jQuery对象可以被认为是平等的另一种意义是它们是否具有相同的选择器和上下文。这很容易测试:'A.selector === B.selector && A.context === B.context'。通常上下文总是相同的,所以我们只需要考虑选择器。 – Casebash 2010-07-05 04:55:21

+2

@Casebash - true,但是请考虑几个选择器可能会得到相同的结果集,例如:'$(':first')'和'$('*:first')' – nickf 2010-07-05 08:07:42

+6

[更小的解决方案 - 使用'$的(a)。是(b)中'](http://stackoverflow.com/q/2448362/9859)。 – rampion 2011-11-25 21:36:23

16

如果你还是不知道,你可以找回原来的对象:

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

因为$("#deviceTypeRoot")也返回对象的数组,其选择已经选择。

+1

这两个警报会显示'true',因为你正在比较DOM元素的引用,'=='和'==='会给你相同的结果(不需要类型强制,它们只是两个对象引用) – CMS 2010-07-05 02:34:19

+0

你的第二个陈述实际上是返回True – Casebash 2010-07-05 02:39:16

+0

啊是的,这是真的。复制并粘贴错误= D – mauris 2010-07-05 04:16:24

8

它,一般来说,一个坏主意,用$(富),因为这是功能上等同于下面的比较比较$(富):

<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") 

是更合适。

+1

要明确,jQuery没有对象属性。 Elf King似乎将此作为伪代码使用 – Casebash 2010-07-05 03:09:46

4

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

+2

使用lodash代替:https://lodash.com/docs#isEqual – 2015-04-28 06:06:35

+0

@KarlGlaser - 任何原因? – 2017-05-28 14:36:59

11

$.fn.equals(...)解决方案可能是最干净和最优雅的一个。

我已经试过的东西快速和肮脏的是这样的:

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

这可能是昂贵的,但舒服的事情是,它是隐含递归的,而优雅的解决方案是没有的。

只是我2美分。

+0

这对于检查两个jQuery对象(除了标准对象)之间的相等性不太好。例如“{a:'x',b:'y',c:'z'} == {a:'x',b:'y',c:'z'}”。我想知道没有jQuery.isEqual(a,b)... – iRaS 2013-04-04 06:44:37

+10

这是错误的。对象属性的顺序很重要。所以如果你有'{a:1,b:2}'和'{b:2,a:1}',当它返回'true'时,它将返回'false'。 – 2014-05-12 19:41:49

+2

@EricAlberson,对于可以处理这种情况的其他深度比较工具或脚本您有什么建议吗? – 2014-08-13 19:14:16