jQuery nesnesi eşitliği


151

İki jQuery nesnesinin eşit olup olmadığını nasıl belirleyebilirim? Belirli bir jQuery nesnesi için bir dizi aramak mümkün olmak istiyorum.

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

Yanıtlar:


225

JQuery 1.6'dan beri kullanabilirsiniz .is. Aşağıda bir yıldan uzun bir süre önce cevap ...

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


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

İki değişkenin gerçekten aynı nesne olup olmadığını görmek istiyorsanız, örneğin:

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

... benzersiz kimliklerini kontrol edebilirsiniz. Her yeni jQuery nesnesi oluşturduğunuzda bir kimlik alır.

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

Yine de, aynı şey basit bir a === b , ancak yukarıdakiler en azından bir sonraki geliştiriciye tam olarak ne için test ettiğinizi gösterebilir.

Her durumda, muhtemelen peşinde değilsiniz. İki farklı jQuery nesnesinin aynı öğe kümesini içerip içermediğini kontrol etmek isterseniz, bunu kullanabilirsiniz:

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

Kaynak

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

Bu çözüm , sadece tek bir eleman olduğunda thephpveloveloper tarafından verilen çözümü basitleştirir . JQuery nesnelerinin eşit kabul edilebileceği başka bir anlam, aynı seçici ve bağlama sahip olup olmadıklarıdır. Bu testin kolay yeterlidir: A.selector === B.selector && A.context === B.context. Genellikle bağlam her zaman aynı olacaktır, bu yüzden sadece seçiciyi düşünmeliyiz.
Casebash

2
@Casebash - true, ancak birkaç seçicinin aynı sonuç kümesiyle sonuçlanabileceğini $(':first')$('*:first')
düşünün

3
Dikkat @Rampion ve Nickf, jQuery (), seçicilerin aynı olduğunu , yalnızca üst üste geldiklerini kontrol etmez . Tanık: jsfiddle.net/bnhkm/1
Bob Stein

sizin equalsişlevi sipariş duyarlı görünmektedir. stackoverflow.com/a/29648479 gibi bir şey daha yavaş olmasına rağmen daha fazla durumda işe yarar.
Jayen

eşittir işlevi yalnızca nesnenin bir düzeyi varsa çalışır! a = b = [{dir: 'test' karşılaştırması, sıralama: [{test: {test: 1}}]}] çalışmıyor
DavidDunham

16

Hala bilmiyorsanız, orijinal nesneyi aşağıdaki yollarla geri alabilirsiniz:

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

çünkü $("#deviceTypeRoot")seçicinin seçtiği bir nesne dizisini de döndürür.


1
İki uyarı görüntülenecektir true, çünkü DOM öğesinin referansını karşılaştırıyorsunuz, ==vs ===size aynı sonuçları verecektir (tip zorlamasına gerek yoktur, bunlar sadece iki nesne referansıdır)
CMS

İkinci
ifadeniz

ah evet bu doğru. kopyala ve yapıştır hatası = D
mauris

14

$.fn.equals(...)Çözelti muhtemelen en temiz ve en zarif biridir.

Böyle hızlı ve kirli bir şey denedim:

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

Muhtemelen pahalı, ama rahat olan şey, zarif çözüm olmasa da, örtük olarak özyinelemeli olmasıdır.

Sadece 2 sentim.


1
bu iki jQuery nesnesi arasındaki eşitliği kontrol etmek için değil, standart nesneler için iyi bir seçimdir. "{a: 'x', b: 'y', c: 'z'} == {a: 'x', b: 'y', c: 'z'}" gibi. Ben hiç jQuery.isEqual (a, b) olduğunu merak ediyorum ...
iRaS

13
Bu yanlış. Nesne özelliklerinin sırası önemlidir. Eğer varsa {a: 1, b: 2}ve {b: 2, a: 1}bu falsene zaman dönmelidir dönecektir true.
Eric Alberson

3
@EricAlberson, bu durumla başa çıkabilen diğer derin karşılaştırma araçları veya komut dosyaları hakkında herhangi bir öneriniz var mı?
Neil Monroe

8

Genel olarak, $ (foo) ile $ (foo) 'yu işlevsel olarak aşağıdaki karşılaştırmaya eşit olduğu için karşılaştırmak kötü bir fikirdir:

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

Tabii ki asla "JS motor vidalama" beklemezsiniz. Ben sadece jQuery ne yaptığını netleştirmek için "$" kullanın.

$ ("# Foo") öğesini her aradığınızda, aslında yeni bir nesne döndüren bir jQuery ("# ​​foo") yapıyorsunuzdur . Bu yüzden onları karşılaştırmak ve aynı nesneyi beklemek doğru değildir.

Ancak yapabileceğiniz şey şudur:

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

Yani gerçekten de gerçek programınızdaki jQuery nesnelerinin kimlik öğelerini karşılaştırmalısınız.

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

daha uygundur.


1
Açıkçası, jQuery'nin bir nesne niteliği yoktur. Elf King bunu sahte kod olarak kullanıyor gibi görünüyor
Casebash


4

Önce bu işlevi kullanarak nesneye göre anahtar sipariş edin

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

Ardından, bu işlevi kullanarak nesnenizin dizilmiş sürümünü karşılaştırın

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

İşte bir örnek

Nesne anahtarlarının farklı sıralandığı ve aynı değerlere sahip olduğu varsayılarak

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

isEqualObject(obj1,obj2);//returns true

-1

İçeriğin eşit olup olmadığını kontrol etmek istiyorsanız JSON.stringify (obj)

Örneğin - var a = {key: val};

var b = {anahtar: val};

JSON.stringify (a) == JSON.stringify (b) -----> İçerikler aynıysa doğru olur.


Anahtarları
Kareem'in
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.