jQuery对象相等


151

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

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

Answers:


225

从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!
}

虽然,可以通过simple实现相同的效果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;
};

资源

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

当只有一个元素时,此解决方案简化为由phpdeveloper提供的解决方案。jQuery对象可以视为相等的另一种含义是它们是否具有相同的选择器和上下文。这是很容易的测试:A.selector === B.selector && A.context === B.context。通常上下文总是相同的,因此我们只需要考虑选择器。
Casebash

2
@Casebash-是的,但是请注意,多个选择器最终可能具有相同的结果集,例如:$(':first')$('*:first')
nickf 2010年

3
注意@rampion和nickf,jQuery is()不会检查选择器是否相同,只是检查它们是否重叠。目击者: jsfiddle.net/bnhkm/1
Bob Stein

您的equals函数似乎对顺序敏感。像stackoverflow.com/a/29648479之类的东西在更多情况下会起作用,尽管速度较慢。
Jayen 2015年

仅当对象具有一级时,equals函数才起作用!比较a = b = [{dir:'test',sort:[{test:{test:1}}]}]]不起作用
DavidDunham

16

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

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

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


1
将显示这两个警报true,因为您正在比较DOM元素的引用,而==vs ===将给您相同的结果(不需要类型强制,它们只是两个对象引用)
CMS 2010年

您的第二条语句实际上返回True
Casebash 2010年

啊,是的。复制并粘贴错误= D
毛里求斯2010年

14

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

我已经尝试过这样快速又肮脏的方法:

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

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

只是我的2美分。


1
这对于检查两个jQuery对象之间的相等性不是很好,但对于标准对象而言则不是。例如“ {a:'x',b:'y',c:'z'} == {a:'x',b:'y',c:'z'}”。我想知道没有jQuery.isEqual(a,b)...
iRaS

13
错了 对象属性的顺序很重要。因此,如果有{a: 1, b: 2}{b: 2, a: 1}它将false在应返回时返回true
埃里克·阿尔伯森

3
@EricAlberson,您对其他可以处理这种情况的深度比较工具或脚本有什么建议吗?
尼尔·门罗

8

一般来说,将$(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")

比较合适。


1
为了清楚起见,jQuery没有对象属性。精灵王似乎正在使用它作为伪代码
Casebash 2010年


4

首先使用此功能基于密钥订购对象

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

-1

如果要检查内容是否相等,则只需使用 JSON.stringify(obj)

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

var b = {key:val};

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


您首先需要像Kareem的答案一样对键进行排序
reggaeguitar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.