jQuery对象相等

时间:2010-07-05 02:22:43

标签: equality jquery

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

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

7 个答案:

答案 0 :(得分:208)

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

答案 1 :(得分:16)

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

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

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

答案 2 :(得分:14)

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

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

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

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

只需2美分。

答案 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>

当然你永远不会指望“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")

更合适。

答案 4 :(得分:4)

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

答案 5 :(得分: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

答案 6 :(得分:-1)

如果要检查内容是否相等,那么就使用 的 JSON.stringify(OBJ)

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

var b = {key:val};

JSON.stringify(a)== JSON.stringify(b) -----&gt;如果内容相同,你就会成真。