jQuery वस्तु समानता


151

यदि दो jQuery की वस्तुएँ समान हैं तो मैं कैसे निर्धारित करूँ? मैं एक विशेष jQuery वस्तु के लिए एक सरणी खोज करने में सक्षम होना चाहते हैं।

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

जवाबों:


225

JQuery 1.6 के बाद से, आप उपयोग कर सकते हैं .is। नीचे एक साल पहले से जवाब है ...

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


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

यदि आप यह देखना चाहते हैं कि क्या दो चर वास्तव में एक ही वस्तु हैं, उदाहरण के लिए:

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

... तो आप उनकी यूनिक आईडी चेक कर सकते हैं। हर बार जब आप एक नया jQuery ऑब्जेक्ट बनाते हैं तो यह एक आईडी हो जाता है।

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

स्रोत

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

यह समाधान केवल एक ही तत्व होने पर एफिडेप्रूपर द्वारा दिया गया है। एक और समझदारी जिसमें jQuery की वस्तुओं को समान माना जा सकता है, चाहे उनका चयनकर्ता और संदर्भ समान हो। यह परीक्षण करने के लिए काफी आसान है A.selector === B.selector && A.context === B.context:। अक्सर संदर्भ हमेशा समान रहेगा, इसलिए हमें केवल चयनकर्ता पर विचार करना होगा।
केसबश

2
@ कैसबाश - सच है, हालांकि यह विचार करें कि कई चयनकर्ता एक ही परिणाम सेट के साथ समाप्त हो सकते हैं, उदाहरण के लिए: $(':first')और$('*:first')
8

3
सावधानी @ क्रैम्प और निकफ, jQuery है () यह नहीं जांचता है कि चयनकर्ता समान हैं , केवल यह कि वे ओवरलैप करते हैं। गवाह: jsfiddle.net/bnhkm/1
बॉब स्टीन

आपका equalsकार्य क्रम-संवेदनशील प्रतीत होता है। stackoverflow.com/ जैसी कोई चीज अधिक मामलों में काम करेगी, हालाँकि यह धीमी है।
Jayen

समतुल्य फ़ंक्शन केवल तभी काम करता है जब ऑब्जेक्ट का एक स्तर होता है! a = b = [{dir: 'test',
छँटाई की

16

यदि आप अभी भी नहीं जानते हैं, तो आप मूल वस्तु को वापस पा सकते हैं:

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

क्योंकि $("#deviceTypeRoot")वस्तुओं का एक सरणी भी देता है जिसे चयनकर्ता ने चुना है।


1
दो अलर्ट प्रदर्शित करेंगे true, क्योंकि आप DOM तत्व के संदर्भ की तुलना कर रहे हैं, ==बनाम ===आपको एक ही परिणाम देगा (किसी भी प्रकार के जबरदस्ती की जरूरत नहीं है, वे सिर्फ दो ऑब्जेक्ट संदर्भ हैं)
CMS

आपका दूसरा कथन वास्तव में ट्रू
केसबश

आह हाँ यह सच है कॉपी और पेस्ट की गलती = D
मौरिस

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

यह आम तौर पर बोल रहा है, $ (फू) के साथ $ (फू) की तुलना करने का एक बुरा विचार है जो कार्यात्मक रूप से निम्नलिखित के बराबर है:

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

बेशक आप "जेएस इंजन स्क्रू-अप" की उम्मीद कभी नहीं करेंगे। मैं "$" का उपयोग सिर्फ यह स्पष्ट करने के लिए करता हूं कि 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 वस्तुओं के आईडी तत्वों की तुलना कुछ इस तरह से करें

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

अधिक उपयुक्त है।


1
बस स्पष्ट होने के लिए, jQuery में एक वस्तु विशेषता नहीं है। एल्फ किंग इसे स्यूडोकोड के रूप में उपयोग कर रहे हैं
केसबश


4

इस फ़ंक्शन का उपयोग करके कुंजी के आधार पर पहले अपनी वस्तु को ऑर्डर करें

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

फिर, इस funtion का उपयोग करते हुए, अपने ऑब्जेक्ट के स्ट्रिंग संस्करण की तुलना करें

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) -----> यदि सामग्री समान है तो आप सही हो जाते हैं।


आपको सबसे पहले करीम के उत्तर की तरह कुंजियों को क्रमबद्ध करना होगा
reggaeguitar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.