kesetaraan objek jQuery

151

Bagaimana cara menentukan apakah dua objek jQuery sama? Saya ingin dapat mencari array untuk objek jQuery tertentu.

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

Jawaban:

225

Sejak jQuery 1.6, Anda dapat menggunakan .is. Di bawah ini adalah jawaban dari lebih dari setahun yang lalu ...

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


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

Jika Anda ingin melihat apakah dua variabel sebenarnya objek yang sama, misalnya:

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

... maka Anda dapat memeriksa ID unik mereka. Setiap kali Anda membuat objek jQuery baru, ia mendapat id.

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

Padahal, hal yang sama dapat dicapai dengan sederhana a === b, di atas mungkin setidaknya menunjukkan pengembang berikutnya persis apa yang Anda uji.

Bagaimanapun, itu mungkin bukan yang Anda cari. Jika Anda ingin memeriksa apakah dua objek jQuery berbeda berisi set elemen yang sama, Anda bisa menggunakan ini:

$.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;
};

Sumber

var a = $('p');
var b = $('p');
if (a.equals(b)) {
    // same set
}
nickf
sumber
Solusi ini disederhanakan menjadi yang diberikan oleh pengembang saat hanya ada satu elemen. Arti lain di mana objek jQuery dapat dianggap sama adalah apakah mereka memiliki pemilih dan konteks yang sama. Hal ini cukup mudah untuk menguji: A.selector === B.selector && A.context === B.context. Seringkali konteksnya akan selalu sama, jadi kita hanya perlu mempertimbangkan pemilih.
Casebash
2
@Casebash - true, namun pertimbangkan bahwa beberapa penyeleksi dapat berakhir dengan set hasil yang sama, misalnya: $(':first')dan$('*:first')
nickf
3
Perhatian @rampion dan nickf, jQuery is () tidak memeriksa bahwa penyeleksi identik , hanya bahwa mereka tumpang tindih. Saksi: jsfiddle.net/bnhkm/1
Bob Stein
equalsfungsi Anda tampaknya peka terhadap pesanan. sesuatu seperti stackoverflow.com/a/29648479 akan berfungsi dalam lebih banyak kasus, meskipun lebih lambat.
Jayen
fungsi equals hanya berfungsi jika objek memiliki satu level! membandingkan a = b = [{dir: 'test', urutkan: [{test: {test: 1}}]}] tidak berfungsi
DavidDunham
16

Jika Anda masih tidak tahu, Anda bisa mendapatkan kembali objek aslinya dengan:

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

karena $("#deviceTypeRoot")juga mengembalikan array objek yang dipilih pemilih.

mauris
sumber
1
Dua lansiran akan ditampilkan true, karena Anda membandingkan referensi elemen DOM, ==vs ===akan memberi Anda hasil yang sama (tidak ada paksaan jenis yang diperlukan, mereka hanya dua referensi objek)
CMS
Pernyataan kedua Anda sebenarnya kembali Benar
Casebash
ah ya itu benar. salin dan tempel kesalahan = D
mauris
14

The $.fn.equals(...)solusi adalah mungkin yang paling bersih dan paling elegan.

Saya telah mencoba sesuatu yang cepat dan kotor seperti ini:

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

Ini mungkin mahal, tetapi hal yang nyaman adalah bahwa itu secara implisit bersifat rekursif, sedangkan solusi yang elegan tidak.

Hanya 2 sen saya.

Roberto Pierpaoli
sumber
1
itu tidak baik untuk memeriksa kesetaraan antara dua objek jQuery tetapi untuk objek standar. seperti "{a: 'x', b: 'y', c: 'z'} == {a: 'x', b: 'y', c: 'z'}". Saya ingin tahu bahwa tidak ada jQuery.isEqual (a, b) ...
iRaS
13
Ini salah. Urutan properti objek penting. Jadi jika sudah {a: 1, b: 2}dan {b: 2, a: 1}ini akan kembali falsekapan harus kembali true.
Eric Alberson
3
@EricAlberson, apakah Anda memiliki saran tentang alat perbandingan atau skrip mendalam lainnya yang dapat menangani situasi ini?
Neil Monroe
8

Secara umum, adalah ide yang buruk untuk membandingkan $ (foo) dengan $ (foo) karena itu secara fungsional setara dengan perbandingan berikut:

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

Tentu saja Anda tidak akan pernah mengharapkan "JS engine screw-up". Saya menggunakan "$" hanya untuk memperjelas apa yang sedang dilakukan jQuery.

Setiap kali Anda menelepon $ ("# foo"), Anda benar-benar melakukan jQuery ("# ​​foo") yang mengembalikan objek baru . Jadi membandingkan mereka dan mengharapkan objek yang sama tidak benar.

Namun apa yang BISA Anda lakukan adalah sesuatu seperti:

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

Jadi sebenarnya Anda mungkin harus membandingkan elemen ID dari objek jQuery di program Anda yang sebenarnya

... 
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")

lebih tepat.

Elf King
sumber
1
Supaya jelas, jQuery tidak memiliki atribut objek. Elf King tampaknya menggunakan ini sebagai pseudocode
Casebash
4

Pertama, pesan objek Anda berdasarkan kunci menggunakan fungsi ini

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

Kemudian, bandingkan versi string dari objek Anda, menggunakan funtion ini

function isEqualObject(a,b){
    return JSON.stringify(sortObject(a)) == JSON.stringify(sortObject(b));
}

Berikut ini sebuah contoh

Mengasumsikan kunci objek diurutkan secara berbeda dan memiliki nilai yang sama

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

isEqualObject(obj1,obj2);//returns true
Kareem
sumber
-1

Jika Anda ingin memeriksa isinya sama atau tidak, gunakan JSON.stringify (obj)

Misalnya - var a = {key: val};

var b = {key: val};

JSON.stringify (a) == JSON.stringify (b) -----> Jika isinya sama, Anda menjadi benar.

Vikram
sumber
Anda harus mengurutkan kunci terlebih dahulu seperti jawaban Kareem
reggaeguitar