জাভাস্ক্রিপ্ট অবজেক্টের দুটি অ্যারে তুলনা করতে jQuery ব্যবহার করে


93

আমার কাছে জাভাস্ক্রিপ্ট অবজেক্টের দুটি অ্যারে রয়েছে যেগুলি সেগুলি একই কিনা তা দেখতে আমি তুলনা করতে চাই। প্রতিটি অ্যারেতে একই জিনিসগুলিতে অবজেক্টগুলি (এবং সম্ভবত সম্ভবত হবে না) হতে পারে। প্রতিটি অ্যারে 10 টির বেশি অবজেক্ট থাকা উচিত নয়। আমি ভেবেছিলাম jQuery এর এই সমস্যার একটি দুর্দান্ত সমাধান থাকতে পারে তবে আমি খুব বেশি অনলাইনে খুঁজে পাচ্ছিলাম না।

আমি জানি যে একটি নিষ্ঠুর নেস্টেড $.each(array, function(){})সমাধান কাজ করতে পারে, তবে এমন কোনও কাজ রয়েছে যা সম্পর্কে আমি অবগত নই?

ধন্যবাদ

উত্তর:


278

একটি সহজ উপায় আছে ...

$(arr1).not(arr2).length === 0 && $(arr2).not(arr1).length === 0

যদি উপরেরটি সত্য হয়, উপাদানগুলি বিভিন্ন ক্রমে থাকলেও উভয় অ্যারে একই হয়।

দ্রষ্টব্য: JSON অবজেক্ট ব্যবহার করার সময় এটি কেবল jquery সংস্করণ <3.0.0 এর জন্য কাজ করে


12
+1, তবে এটি ঠিক সমান হয় যখন আপনি একই বৈশিষ্ট্যযুক্ত কোনও অবজেক্টের সাথে অ্যারের তুলনা করেন, f.ex[0,1] == {0:0,1:1,length=2}
ডেভিড হেলসিং

4
কেন $(arr1).not(arr2).length == 0যথেষ্ট নয়?
অ্যালেক্সেক্সাস

10
অ্যালেক্সেক্সাস, আপনার উভয় তুলনা প্রয়োজন কারণ notএকটি ফিল্টার ফাংশন, কোনও সমতা ফাংশন নয়। সঙ্গে এটি ব্যবহার করে দেখুন [1,2]এবং [1]। এক ক্রমে, আপনি পাবেন []এবং অন্যটিতে আপনি পাবেন [2]
Noyo

4
মনে রাখবেন আপনার যদি অ্যারেতে সদৃশ থাকে তবে এটি সত্য হবে। সুতরাং এর মতো কিছু: `[1,1,2,2,3,3] == [1,2,3]। সত্য।
ফিল্ল_টি

4
jQuery notআর 3.0.0-আরসি 1 হিসাবে জেনেরিক বস্তুর সাথে কাজ করে না। Github.com/jquery/jquery/issues/3147
মার্ক-আন্দ্রে লাফোর্টুন

35

আমি আজ এটিও সন্ধান করছিলাম এবং খুঁজে পেয়েছি: http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256BFB0077DFFD

এটি একটি ভাল সমাধান কিনা তা আপনি জানেন না যদিও তারা বিবেচনায় নেওয়া কয়েকটি কার্যকারিতা বিবেচনা করে।

আমি jQuery সহায়ক পদ্ধতির ধারণা পছন্দ করি। @ ডেভিড আমি বরং আপনার তুলনামূলক পদ্ধতিটি দেখতে এর মতো দেখতে চাই:

jQuery.compare(a, b)

আমার কাছে করাটা আমি বোধ করি না:

$(a).compare(b)

যেখানে a এবং b অ্যারে হয়। সাধারণত যখন আপনি $ (কিছু) করেন তখন আপনি কোনও ডিওএম উপাদানগুলির সাথে কাজ করার জন্য একটি নির্বাচক স্ট্রিংটি পাস করেন।

বাছাই করা অ্যারেগুলি বাছাই এবং 'ক্যাশে করা' সম্পর্কিত:

  • আমি মনে করি না যে পদ্ধতিটির শুরুতে প্রতিবার লুপের পরিবর্তে একবার বাছাই করা 'ক্যাশিং'। আপনি যখনই তুলনা (বি) বলবেন ততবারই বাছাই হবে। এটি কেবল শব্দার্থক, তবে ...
  • (var i = 0; t [i]; i ++) { ... আপনার টি অ্যারেতে কোথাও যদি কোনও ভ্যালু থাকে তবে এই লুপটি তাড়াতাড়ি শেষ হয়ে যায় , সুতরাং $ ([1, 2, 3, 4])। তুলনা করুন ( [1, ভুয়া, 2, 3]) সত্য ফিরে !
  • আরো উল্লেখযোগ্য অ্যারের সাজানোর () মেথড অ্যারের বাছাই করে জায়গায় , এমনটি খ = t.sort () Var ... মূল অ্যারের একটি সাজানো অনুলিপি তৈরি করে না, এটি বাছাই করে মূল অ্যারের এবং একটি নির্ধারণ রেফারেন্স থেকে এটি । আমি মনে করি না তুলনা পদ্ধতিটির পার্শ্ব প্রতিক্রিয়া হওয়া উচিত।

দেখে মনে হচ্ছে আমাদের কাজগুলি করার আগে অ্যারেগুলি অনুলিপি করা উচিত। কীভাবে jQuery উপায়ে এটি করতে পেলাম তার সেরা উত্তরটি এখানে জন রেসিগ ছাড়া অন্য কারও ছিল না! জাভাস্ক্রিপ্টে কোনও বিষয় গভীরভাবে ক্লোন করার সবচেয়ে কার্যকর উপায় কী? (অবজেক্ট ক্লোনিং রেসিপিটির অ্যারে সংস্করণের জন্য তার উত্তরের মন্তব্য দেখুন)

যে ক্ষেত্রে আমি মনে করি এটির জন্য কোডটি হ'ল:

jQuery.extend({
    compare: function (arrayA, arrayB) {
        if (arrayA.length != arrayB.length) { return false; }
        // sort modifies original array
        // (which are passed by reference to our method!)
        // so clone the arrays before sorting
        var a = jQuery.extend(true, [], arrayA);
        var b = jQuery.extend(true, [], arrayB);
        a.sort(); 
        b.sort();
        for (var i = 0, l = a.length; i < l; i++) {
            if (a[i] !== b[i]) { 
                return false;
            }
        }
        return true;
    }
});

var a = [1, 2, 3];
var b = [2, 3, 4];
var c = [3, 4, 2];

jQuery.compare(a, b);
// false

jQuery.compare(b, c);
// true

// c is still unsorted [3, 4, 2]

4
আসলে আমি সম্ভবত এই পদ্ধতির নাম 'তুলনা' না করে 'অ্যারে কম্পায়ার' করব কারণ এটিই কাজ করার জন্য ডিজাইন করা একমাত্র জিনিস ...
অ্যান্ট্রপিক

সত্যিই স্পট। অনেক ধন্যবাদ.
ডিমিটার্ভিপ

14

আমার দৃষ্টিভঙ্গিটি একেবারেই আলাদা ছিল - আমি JSON.stringify ব্যবহার করে উভয় সংগ্রহকে সমতল করেছি এবং সাম্যতার জন্য যাচাই করার জন্য একটি সাধারণ স্ট্রিং ব্যবহার করে।

অর্থাৎ

var arr1 = [
             {Col: 'a', Val: 1}, 
             {Col: 'b', Val: 2}, 
             {Col: 'c', Val: 3}
           ];

var arr2 = [
             {Col: 'x', Val: 24}, 
             {Col: 'y', Val: 25}, 
             {Col: 'z', Val: 26}
           ];

if(JSON.stringify(arr1) == JSON.stringify(arr2)){
    alert('Collections are equal');
}else{
    alert('Collections are not equal');
}

নোট: দয়া করে নোট করুন যে তার পদ্ধতিটি ধরে নিয়েছে যে উভয় সংগ্রহ একই ধরণের সাজানো হয়েছে, যদি তা না হয় তবে এটি আপনাকে একটি ভুল ফলাফল দেয়!


4
আমার ইউনিট পরীক্ষায় অ্যারেগুলি তুলনা করার জন্য আমার একটি সহজ পদ্ধতির দরকার ছিল, দুটি অ্যারের একই আদেশের আশ্বাস দিয়ে। এটা খুব সুন্দর, ধন্যবাদ।
aymericbeaumet

ধন্যবাদ আপনি আমার দিনটি রক্ষা করেছেন
সৌরভ কুমার শর্মা

12

উভয় অ্যারেটিকে স্ট্রিংয়ে রূপান্তর করুন এবং তুলনা করুন

if (JSON.stringify(array1) == JSON.stringify(array2))
{
    // your code here
}

4
নেস্টেড অ্যারেগুলির তুলনা করার জন্য ভাল মনে হয় এবং যখন অর্ডার গুরুত্বপূর্ণ।
পিয়েরে লেস্পিনে

3

আমি এই আলোচনাটি খুঁজে পেয়েছি কারণ অ্যারে এবং অবজেক্টগুলির গভীর তুলনা করার জন্য আমার একটি উপায়ের প্রয়োজন ছিল। এখানে উদাহরণগুলি ব্যবহার করে, আমি নিম্নলিখিতগুলি নিয়ে এসেছি (স্বচ্ছতার জন্য 3 টি পদ্ধতিতে বিভক্ত হয়েছি):

jQuery.extend({
    compare : function (a,b) {
        var obj_str = '[object Object]',
            arr_str = '[object Array]',
            a_type  = Object.prototype.toString.apply(a),
            b_type  = Object.prototype.toString.apply(b);

            if ( a_type !== b_type) { return false; }
            else if (a_type === obj_str) {
                return $.compareObject(a,b);
            }
            else if (a_type === arr_str) {
                return $.compareArray(a,b);
            }
            return (a === b);
        }
});

jQuery.extend({
    compareArray: function (arrayA, arrayB) {
        var a,b,i,a_type,b_type;
        // References to each other?
        if (arrayA === arrayB) { return true;}

        if (arrayA.length != arrayB.length) { return false; }
        // sort modifies original array
        // (which are passed by reference to our method!)
        // so clone the arrays before sorting
        a = jQuery.extend(true, [], arrayA);
        b = jQuery.extend(true, [], arrayB);
        a.sort(); 
        b.sort();
        for (i = 0, l = a.length; i < l; i+=1) {
            a_type = Object.prototype.toString.apply(a[i]);
            b_type = Object.prototype.toString.apply(b[i]);

            if (a_type !== b_type) {
                return false;
            }

            if ($.compare(a[i],b[i]) === false) {
                return false;
            }
        }
        return true;
    }
});

jQuery.extend({
    compareObject : function(objA,objB) {

        var i,a_type,b_type;

        // Compare if they are references to each other 
        if (objA === objB) { return true;}

        if (Object.keys(objA).length !== Object.keys(objB).length) { return false;}
        for (i in objA) {
            if (objA.hasOwnProperty(i)) {
                if (typeof objB[i] === 'undefined') {
                    return false;
                }
                else {
                    a_type = Object.prototype.toString.apply(objA[i]);
                    b_type = Object.prototype.toString.apply(objB[i]);

                    if (a_type !== b_type) {
                        return false; 
                    }
                }
            }
            if ($.compare(objA[i],objB[i]) === false){
                return false;
            }
        }
        return true;
    }
});

পরীক্ষামূলক

var a={a : {a : 1, b: 2}},
    b={a : {a : 1, b: 2}},
    c={a : {a : 1, b: 3}},
    d=[1,2,3],
    e=[2,1,3];

console.debug('a and b = ' + $.compare(a,b)); // a and b = true
console.debug('b and b = ' + $.compare(b,b)); // b and b = true
console.debug('b and c = ' + $.compare(b,c)); // b and c = false
console.debug('c and d = ' + $.compare(c,d)); // c and d = false
console.debug('d and e = ' + $.compare(d,e)); // d and e = true

3

আমার ক্ষেত্রে তুলনামূলক অ্যারেতে কেবল সংখ্যা এবং স্ট্রিং থাকে । এই সমাধানটি আমার পক্ষে কাজ করেছে:

function are_arrs_equal(arr1, arr2){
    return arr1.sort().toString() === arr2.sort().toString()
}

আসুন এটি পরীক্ষা!

arr1 = [1, 2, 3, 'nik']
arr2 = ['nik', 3, 1, 2]
arr3 = [1, 2, 5]

console.log (are_arrs_equal(arr1, arr2)) //true
console.log (are_arrs_equal(arr1, arr3)) //false

1

এটি করার জন্য একটি ভাল "jQuery" উপায় আছে বলে আমি মনে করি না, তবে যদি আপনার দক্ষতার প্রয়োজন হয় তবে একটি নির্দিষ্ট কী (একটি অনন্য অবজেক্ট ক্ষেত্রের একটি) দ্বারা অ্যারেগুলির একটিকে ম্যাপ করুন এবং তারপরে অন্য অ্যারের মাধ্যমে লুপিং করে তুলনা করুন এবং আপনি সবেমাত্র তৈরি করা মানচিত্র বা সাহসী অ্যারের সাথে তুলনা করছেন

দক্ষতা যদি কোনও সমস্যা না হয় তবে কেবল এ এর ​​প্রতিটি বস্তুকে বি এর প্রতিটি বস্তুর সাথে তুলনা করুন যতক্ষণ না | এ | এবং | বি | ছোট, আপনার ঠিক আছে।


@ স্টেফান, দ্রুত প্রতিক্রিয়ার জন্য ধন্যবাদ। আপনি কি আপনার ম্যাপিং ধারণার জন্য উদাহরণ কোড পোস্ট করতে পারেন? ধন্যবাদ
মেগা ম্যাট

1

ঠিক আছে, আপনি যদি কেবল অ্যারেগুলির বিষয়বস্তু তুলনা করতে চান তবে একটি দরকারী jQuery ফাংশন রয়েছে in .inArray ()

var arr = [11, "String #1", 14, "String #2"];
var arr_true = ["String #1", 14, "String #2", 11]; // contents are the same as arr
var arr_false = ["String #1", 14, "String #2", 16]; // contents differ

function test(arr_1, arr_2) {
    var equal = arr_1.length == arr_2.length; // if array sizes mismatches, then we assume, that they are not equal
    if (equal) {
        $.each(arr_1, function (foo, val) {
            if (!equal) return false;
            if ($.inArray(val, arr_2) == -1) {
                equal = false;
            } else {
                equal = true;
            }
        });
    }
    return equal;
}

alert('Array contents are the same? ' + test(arr, arr_true)); //- returns true
alert('Array contents are the same? ' + test(arr, arr_false)); //- returns false

ভাল সমাধান, তবে আমি নিশ্চিত নই যে এটি একই উপাদানগুলির সাথে থাকা অ্যারেগুলির জন্য অ্যাকাউন্টিং করছে তবে একটি ভিন্ন ক্রমে।
মেগা ম্যাট

(! সমান) মিথ্যা ফিরলে আপনি সরে যেতে পারেন; নীচে নীচে to। আবার ফাংশন গুলি ছোঁড়া এড়ানোর জন্য যান। এবং আপনি সমান ফিরে আসতে পারেন; একটি তুলনা এড়ানোর জন্য।
ম্যাট

1

অ্যারে স্ট্রিং এ পরিবর্তন করুন এবং তুলনা করুন

var arr = [1,2,3], 
arr2 = [1,2,3]; 
console.log(arr.toString() === arr2.toString());

1

JQuery গ্লোবাল পদ্ধতি হিসাবে সুধাকর আর এর দুর্দান্ত একটি লাইনার ।

/**
 * Compare two arrays if they are equal even if they have different order.
 *
 * @link https://stackoverflow.com/a/7726509
 */
jQuery.extend({
  /**
   * @param {array} a
   *   First array to compare.
   * @param {array} b
   *   Second array to compare.
   * @return {boolean}
   *   True if both arrays are equal, otherwise false.
   */
  arrayCompare: function (a, b) {
    return $(a).not(b).get().length === 0 && $(b).not(a).get().length === 0;
  }
});

0

JQuery এর সাথে কিছু অ্যারের তুলনা করার সময় আমি এটিও পেয়েছি। আমার ক্ষেত্রে আমার কাছে স্ট্রিং ছিল যা আমি অ্যারে হিসাবে জানতাম:

var needle = 'apple orange';
var haystack = 'kiwi orange banana apple plum';

তবে আমি যত্ন করেছিলাম এটি একটি সম্পূর্ণ ম্যাচ বা কেবল একটি আংশিক ম্যাচ ছিল, তাই আমি সুধাকর আর এর উত্তরের ভিত্তিতে নীচের মতো কিছু ব্যবহার করেছি:

function compareStrings( needle, haystack ){
  var needleArr = needle.split(" "),
    haystackArr = haystack.split(" "),
    compare = $(haystackArr).not(needleArr).get().length;

  if( compare == 0 ){
    return 'all';
  } else if ( compare == haystackArr.length  ) {
    return 'none';
  } else {
    return 'partial';
  }
}

0

যদি সদৃশগুলি [1, 1, 2]সমান হওয়া উচিত নয় তবে সমান [2, 1]হওয়া উচিত তবে [1, 2, 1]এখানে একটি রেফারেন্স গণনা সমাধান রয়েছে:

  const arrayContentsEqual = (arrayA, arrayB) => {
    if (arrayA.length !== arrayB.length) {
      return false}

    const refCount = (function() {
      const refCountMap = {};
      const refCountFn = (elt, count) => {
          refCountMap[elt] = (refCountMap[elt] || 0) + count}
      refCountFn.isZero = () => {
        for (let elt in refCountMap) {
          if (refCountMap[elt] !== 0) {
            return false}}
        return true}
      return refCountFn})()

    arrayB.map(eltB => refCount(eltB, 1));
    arrayA.map(eltA => refCount(eltA, -1));
    return refCount.isZero()}

এখানে খেলতে যাওয়ার মতো ফ্রিডল


0

var arr1 = [
             {name: 'a', Val: 1}, 
             {name: 'b', Val: 2}, 
             {name: 'c', Val: 3}
           ];

var arr2 = [
             {name: 'c', Val: 3},
             {name: 'x', Val: 4}, 
             {name: 'y', Val: 5}, 
             {name: 'z', Val: 6}
           ];
var _isEqual = _.intersectionWith(arr1, arr2, _.isEqual);// common in both array
var _difference1 = _.differenceWith(arr1, arr2, _.isEqual);//difference from array1 
var _difference2 = _.differenceWith(arr2, arr1, _.isEqual);//difference from array2 
console.log(_isEqual);// common in both array
console.log(_difference1);//difference from array1 
console.log(_difference2);//difference from array2 
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>


-3

এটা চেষ্টা কর

function check(c,d){
  var a = c, b = d,flg = 0;
  if(a.length == b.length) 
  { 
     for(var i=0;i<a.length;i++) 
           a[i] != b[i] ? flg++ : 0; 
  } 
  else  
  { 
     flg = 1; 
  } 
  return flg = 0;
}

এটি a এবং b উভয়ই সংশোধন করে এবং কেবল প্রথম উপাদানটির সাথে তুলনা করে। ডাব্লুটিএফ
স্কটজে

4
@ স্কটজে মিঃএইচ প্রশ্নটি দুটি অ্যারের তুলনা করতে হবে .. বাছাই করার পরে যদি উভয় অ্যারে সমান হয় [0] == খ [0] আপনি বাহ।
ব্যতিক্রম

4
আমি ভীত, আমি জানি না এএইচ মানে কী, এবং গুগল কোনও সহায়তা ছিল না। তবে যদি আমার মন্তব্যটি এতটা বেস-বেস ছিল, তবে 21 শে ফেব্রুয়ারী কেন এই কোডটি পুরোপুরি পুনরায় লেখা হয়েছিল?
স্কটজে

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