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
}

এই সমাধানটি কেবলমাত্র যখন কোনও একক উপাদান থাকে তখন থেমে থেমে থেমে থেমে যায় ph আর একটি ধারণা যা jQuery অবজেক্ট সমান হিসাবে বিবেচনা করা যেতে পারে তা হচ্ছে তাদের একই নির্বাচক এবং প্রসঙ্গ আছে কিনা। এই পরীক্ষাটি করা সহজ যথেষ্ট: A.selector === B.selector && A.context === B.context। প্রায়শই প্রসঙ্গে সবসময় একই থাকে, তাই আমাদের কেবল নির্বাচক বিবেচনা করতে হবে।
কেসব্যাশ

2
@ ক্যাসবাশ - সত্য, তবে বিবেচনা করুন যে বেশ কয়েকটি নির্বাচক একই ফলাফলের সেটটি সমাপ্ত করতে পারে, যেমন: $(':first')এবং$('*:first')
নিকফ

3
@ ইরাম্পিয়ন এবং নিকফ সাবধান, jQuery হয় () যাচাই করেন যে নির্বাচকরা অভিন্ন , কেবল যে তারা ওভারল্যাপ করে। উত্তর: jsfiddle.net/bnhkm/1
বব স্টেইন

আপনার equalsফাংশনটি অর্ডার-সংবেদনশীল বলে মনে হচ্ছে। স্ট্যাকওভারফ্লো.com/a/29648479 এর মতো আরও কিছু ক্ষেত্রে এটি কাজ করবে যদিও এটি ধীর।
জয়েন

সমান ফাংশনটি কেবল তখনই কাজ করে যদি বস্তুর একটি স্তর থাকে! তুলনা a = b = [ir dir: 'পরীক্ষা', সাজান: [{পরীক্ষা: {পরীক্ষা: 1}}]}] কাজ করে না
ডেভিডডনহাম

16

যদি আপনি এখনও না জানেন তবে আপনি মূল বিষয়টি ফিরে পেতে পারেন:

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

কারণ $("#deviceTypeRoot")এছাড়াও নির্বাচক নির্বাচন করা বস্তুর একটি অ্যারে প্রদান করে।


1
দুটি সতর্কতা প্রদর্শিত হবে true, কারণ আপনি ডিওএম উপাদানটির রেফারেন্স তুলনা করছেন, ==বনাম ===আপনাকে একই ফলাফল দেবে (কোনও ধরণের জবরদস্তির প্রয়োজন নেই, সেগুলি কেবল দুটি বস্তুর রেফারেন্স)
সিএমএস

আপনার দ্বিতীয় বিবৃতিটি সত্যই ফিরে আসছে
কেসব্যাশ

আহ হ্যাঁ এটা সত্য অনুলিপি এবং পেস্ট ভুল = ডি
মরিস

14

$.fn.equals(...)সমাধান সম্ভবত cleanest এবং সবচেয়ে মার্জিত অন্যতম।

আমি এর মতো দ্রুত এবং নোংরা কিছু চেষ্টা করেছি:

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

এটি সম্ভবত ব্যয়বহুল, তবে আরামদায়ক জিনিসটি এটি স্পষ্টতই পুনরাবৃত্তিযোগ্য, যদিও মার্জিত সমাধানটি নয়।

শুধু আমার 2 সেন্ট।


1
এটি দুটি jQuery অবজেক্টের মধ্যে সমতা যাচাই করার জন্য নয় তবে স্ট্যান্ডার্ড অবজেক্টের জন্য ভাল। "{a: 'x', b: 'y', c: 'z'} == {a: 'x', b: 'y', c: 'z'।" এর মতো। আমি ভাবছি যে এখানে jQuery.isEqual (ক, খ) নেই ...
আইআরএস

13
এটা ভুল. বিষয়বস্তুর বৈশিষ্ট্যের বিষয়গুলির ক্রম। সুতরাং আপনার যদি থাকে {a: 1, b: 2}এবং এটি {b: 2, a: 1}ফিরে আসবে falseযখন এটি ফিরে আসবে true
এরিক অ্যালবারসন

3
@ এরিক অ্যালবারসন, আপনার অন্যান্য গভীর তুলনা সরঞ্জাম বা স্ক্রিপ্টগুলির বিষয়ে কোনও পরামর্শ আছে যা এই পরিস্থিতিটি পরিচালনা করতে পারে?
নিল মনরো

8

এটি সাধারণত বলা যায় যে function (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>

অবশ্যই আপনি কখনই "জেএস ​​ইঞ্জিন স্ক্রু-আপ" আশা করবেন না। 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 অবজেক্টগুলির আইডি উপাদানগুলির তুলনা করা উচিত যাতে এর মতো কিছু something

... 
$(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), {});
}

তারপরে, এই মজাদার ব্যবহার করে আপনার অবজেক্টের স্ট্রিংফাইড সংস্করণটি তুলনা করুন

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 (আপত্তি) ব্যবহার করুন

যেমন - var a = {কী: ভাল};

var b = {কী: ভাল};

JSON.stringify (a) == JSON.stringify (b) -----> বিষয়বস্তু যদি একই হয় তবে আপনি সত্য হন।


আপনাকে প্রথমে
কেরিমের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.