web-dev-qa-db-ja.com

jQueryオブジェクトの平等

2つのjQueryオブジェクトが等しいかどうかを確認するにはどうすればよいですか?特定のjQueryオブジェクトの配列を検索できるようにしたいと思います。

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

JQuery 1.6以降では、 .is を使用できます。以下は1年以上前の回答です...

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


if (a.is(b)) {
    // the same object!
}

2つの変数が実際に同じオブジェクトであるかどうかを確認したい場合、例えば:

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

...その後、一意のIDを確認できます。新しいjQueryオブジェクトを作成するたびに、IDを取得します。

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

単純なa === bでも同じことが実現できますが、上記は少なくとも次の開発者にテスト対象を正確に示している可能性があります。

いずれにせよ、それはおそらくあなたが望んでいることではないでしょう。 2つの異なる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
}
213
nickf

それでもわからない場合は、次の方法で元のオブジェクトを取得できます。

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

$("#deviceTypeRoot")は、セレクターが選択したオブジェクトの配列も返すためです。

16
mauris

$.fn.equals(...)ソリューションは、おそらく最もクリーンでエレガントなソリューションです。

私はこのような迅速で汚れたものを試しました:

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

おそらく高価ですが、快適なのは暗黙的に再帰的であり、エレガントなソリューションはそうではないということです。

ちょうど私の2セント。

15

一般的に、$(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")

より適切です。

9
Elf King

この関数を使用して、キーに基づいてオブジェクトを最初に順序付けします

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
4
Kareem

Underscore.js isEqualメソッドを使用 http://underscorejs.org/#isEqual

4
Remo H. Jansen

内容が等しいかどうかを確認する場合は、単にJSON.stringify(obj)を使用します

例えば-var a = {key:val};

var b = {key:val};

JSON.stringify(a JSON.stringify(b))== ----->内容が同じ場合、trueになります。

0
Vikram