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


988

আমি দুটি অ্যারে তুলনা করতে চাই ... আদর্শভাবে, দক্ষতার সাথে। অভিনব কিছুই নয়, কেবল trueযদি তারা অভিন্ন হয় falseতবে এবং নাও। অবাক করার মতো বিষয় নয় যে তুলনা অপারেটর কাজ করে বলে মনে হচ্ছে না।

var a1 = [1,2,3];
var a2 = [1,2,3];
console.log(a1==a2);    // Returns false
console.log(JSON.stringify(a1)==JSON.stringify(a2));    // Returns true

JSON প্রতিটি অ্যারে এনকোডিং করে তবে প্রতিটি মান দিয়ে পুনরাবৃত্তি না করে সহজভাবে অ্যারে তুলনা করার কোনও দ্রুত বা "আরও ভাল" উপায় আছে কি?


5
আপনি প্রথমে তাদের দৈর্ঘ্যের তুলনা করতে পারবেন এবং যদি তারা প্রতিটি মান সমান হয়।
টিজেহিউভেল

55
আপনার জন্য দুটি অ্যারে সমান করে কী? একই উপাদান? উপাদান একই আদেশ? JSON হিসাবে এনকোডিং কেবল ততক্ষণ কাজ করে যতক্ষণ অ্যারের উপাদান JSON এ সিরিয়ালাইজ করা যায়। অ্যারেতে যদি বস্তু থাকতে পারে তবে আপনি কত গভীর যেতে পারবেন? দুটি বস্তু কখন "সমান" হয়?
ফেলিক্স ক্লিং

48
@ ফেলিক্সক্লিং, "সমতা" সংজ্ঞায়িত করা অবশ্যই একটি সূক্ষ্ম বিষয়, তবে উচ্চ স্তরের ভাষাগুলি থেকে জাভাস্ক্রিপ্টে আসা লোকদের জন্য নির্বিকার মতো অজুহাত নেই ([] == []) == false
অ্যালেক্স ডি

4
@ অ্যালেক্সডি দেখে মনে হচ্ছে অ্যারেগুলি রেফারেন্স সমতা ব্যবহার করে যা আপনি প্রত্যাশা করতেন। আপনি যদি এটি না করতে পারেন তবে এটি অত্যন্ত ভয়াবহ হবে
জনিআআআআআআ

3
@ অ্যালেক্সডি আমি এমন কোনও ভাষা নিয়ে ভাবতে পারি না যেখানে এটি ঘটে না। সি ++ এ আপনি দুটি পয়েন্টার তুলনা করছেন - মিথ্যা। জাভাতে, আপনি জাভাস্ক্রিপ্টের মতোই করছেন। পিএইচপি-তে, পর্দার আড়ালে থাকা কিছুগুলি অ্যারে দিয়ে লুপ করবে - আপনি কি পিএইচপিকে উচ্চ স্তরের ভাষা বলছেন?
টোমা জ্যাটো - মনিকা

উত্তর:


877

অ্যারে তুলনা করতে, এগুলির মাধ্যমে লুপ করুন এবং প্রতিটি মান তুলনা করুন:

অ্যারে তুলনা:

// Warn if overriding existing method
if(Array.prototype.equals)
    console.warn("Overriding existing Array.prototype.equals. Possible causes: New API defines the method, there's a framework conflict or you've got double inclusions in your code.");
// attach the .equals method to Array's prototype to call it on any array
Array.prototype.equals = function (array) {
    // if the other array is a falsy value, return
    if (!array)
        return false;

    // compare lengths - can save a lot of time 
    if (this.length != array.length)
        return false;

    for (var i = 0, l=this.length; i < l; i++) {
        // Check if we have nested arrays
        if (this[i] instanceof Array && array[i] instanceof Array) {
            // recurse into the nested arrays
            if (!this[i].equals(array[i]))
                return false;       
        }           
        else if (this[i] != array[i]) { 
            // Warning - two different object instances will never be equal: {x:20} != {x:20}
            return false;   
        }           
    }       
    return true;
}
// Hide method from for-in loops
Object.defineProperty(Array.prototype, "equals", {enumerable: false});

ব্যবহার:

[1, 2, [3, 4]].equals([1, 2, [3, 2]]) === false;
[1, "2,3"].equals([1, 2, 3]) === false;
[1, 2, [3, 4]].equals([1, 2, [3, 4]]) === true;
[1, 2, 1, 2].equals([1, 2, 1, 2]) === true;

আপনি বলতে পারেন " তবে স্ট্রিংগুলির তুলনা করা আরও দ্রুত - কোনও লুপ নেই ... " ভাল, তবে আপনার অবশ্যই সেখানে লুপগুলি নোট করা উচিত। প্রথম পুনরাবৃত্ত লুপ যা অ্যারেটিকে স্ট্রিংয়ে রূপান্তর করে এবং দ্বিতীয়, এটি দুটি স্ট্রিংয়ের সাথে তুলনা করে। সুতরাং এই পদ্ধতিটি স্ট্রিং ব্যবহারের চেয়ে দ্রুত

আমি বিশ্বাস করি যে বৃহত পরিমাণে ডেটা সর্বদা অ্যারেগুলিতে রাখা উচিত, বস্তুগুলিতে নয়। তবে আপনি যদি অবজেক্ট ব্যবহার করেন তবে সেগুলিও আংশিকভাবে তুলনা করা যেতে পারে।
এখানে কীভাবে:

বস্তুর তুলনা:

আমি উপরে বলেছি, দুটি বস্তুর উদাহরণ কখনই সমান হবে না, এমনকি যদি এই মুহুর্তে একই ডেটা থাকে:

({a:1, foo:"bar", numberOfTheBeast: 666}) == ({a:1, foo:"bar", numberOfTheBeast: 666})  //false

এটির একটি কারণ রয়েছে, যেহেতু সেখানে থাকতে পারে, উদাহরণস্বরূপ বস্তুর মধ্যে ব্যক্তিগত ভেরিয়েবল।

তবে, আপনি যদি কেবলমাত্র তথ্য ধারণ করতে অবজেক্ট কাঠামো ব্যবহার করেন তবে তুলনা করা এখনও সম্ভব:

Object.prototype.equals = function(object2) {
    //For the first loop, we only check for types
    for (propName in this) {
        //Check for inherited methods and properties - like .equals itself
        //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
        //Return false if the return value is different
        if (this.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) {
            return false;
        }
        //Check instance type
        else if (typeof this[propName] != typeof object2[propName]) {
            //Different types => not equal
            return false;
        }
    }
    //Now a deeper check using other objects property names
    for(propName in object2) {
        //We must check instances anyway, there may be a property that only exists in object2
            //I wonder, if remembering the checked values from the first loop would be faster or not 
        if (this.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) {
            return false;
        }
        else if (typeof this[propName] != typeof object2[propName]) {
            return false;
        }
        //If the property is inherited, do not check any more (it must be equa if both objects inherit it)
        if(!this.hasOwnProperty(propName))
          continue;

        //Now the detail check and recursion

        //This returns the script back to the array comparing
        /**REQUIRES Array.equals**/
        if (this[propName] instanceof Array && object2[propName] instanceof Array) {
                   // recurse into the nested arrays
           if (!this[propName].equals(object2[propName]))
                        return false;
        }
        else if (this[propName] instanceof Object && object2[propName] instanceof Object) {
                   // recurse into another objects
                   //console.log("Recursing to compare ", this[propName],"with",object2[propName], " both named \""+propName+"\"");
           if (!this[propName].equals(object2[propName]))
                        return false;
        }
        //Normal value comparison for strings and numbers
        else if(this[propName] != object2[propName]) {
           return false;
        }
    }
    //If everything passed, let's say YES
    return true;
}  

তবে মনে রাখবেন যে এটি জাসনকে ডেটা যেমন ক্লাসের দৃষ্টান্ত এবং অন্যান্য স্টাফের সাথে তুলনা করে না। যদি আপনি মুর জটিল বিষয়গুলির তুলনা করতে চান তবে এই উত্তরটি দেখুন এবং এটি অতি দীর্ঘায়িত ফাংশন
আপনার এই কাজটি Array.equalsকরতে আপনার মূল ফাংশনটি কিছুটা সম্পাদনা করতে হবে:

...
    // Check if we have nested arrays
    if (this[i] instanceof Array && array[i] instanceof Array) {
        // recurse into the nested arrays
        if (!this[i].equals(array[i]))
            return false;
    }
    /**REQUIRES OBJECT COMPARE**/
    else if (this[i] instanceof Object && array[i] instanceof Object) {
        // recurse into another objects
        //console.log("Recursing to compare ", this[propName],"with",object2[propName], " both named \""+propName+"\"");
        if (!this[i].equals(array[i]))
            return false;
        }
    else if (this[i] != array[i]) {
...

আমি উভয় ফাংশন জন্য একটি সামান্য পরীক্ষার সরঞ্জাম তৈরি ।

বোনাস: indexOfএবং সাথে নেস্টেড অ্যারেগুলিcontains

স্যামি বেঞ্চিরিফ আপনার নেস্টেড অ্যারেগুলিতে কোনও নির্দিষ্ট অবজেক্টের সন্ধানের জন্য দরকারী ফাংশন প্রস্তুত করেছে , যা এখানে পাওয়া যায়: https://jsfiddle.net/SamyBencherif/8352y6yw/


27
আপনি কি করতে চান তাহলে কঠোর তুলনা ব্যবহার this[i] !== array[i]পরিবর্তে !=
টিম এস

38
আপনার পদ্ধতি equalsপরিবর্তে কল করা উচিত compare। কমপক্ষে .NET এ, তুলনা করুন সাধারণত একটি স্বাক্ষরিত int প্রদান করে যা নির্দেশ করে যে কোন বস্তুর অপরের চেয়ে বড়। দেখুন: তুলনা করুন
অলিভার

15
এনটিই কেবল এটি করার সঠিক উপায়, এটি যথেষ্ট বেশি কার্যকর। এই প্রশ্নে প্রস্তাবিত সমস্ত পদ্ধতির জন্য আমি এখানে প্রস্তুত একটি দ্রুত jsperf স্ক্রিপ্ট। jsperf.com/compering-arrays2
টোলগা ই

96
পরিবর্তন একটি বিল্ট-ইন টাইপ এর প্রোটোটাইপ স্পষ্টভাবে নয় সঠিক ভাবে
জ্যাসপার

31
তা ছাড়া, এটি পুনরায় লেখার পক্ষে সহজ কিনা তা নিয়ে নয়, এটি একটি উত্তর সম্পর্কে খারাপ অনুশীলন হিসাবে বিবেচিত এমন কিছু প্রস্তাব করা উচিত নয় ( ডেভেলপার.মোজিলা.আর.ইন.ইউ / ডকস / ওয়েবে / জাভাস্ক্রিপ্ট / গুয়াইড/… ) এবং উচিত অবশ্যই "সঠিক পথ" শিরোনামের নীচে এটি করবেন না
জ্যাস্পার

386

যদিও এটি কেবল স্কেলারের অ্যারেগুলির জন্য কাজ করে (নীচের নোটটি দেখুন), এটি সংক্ষিপ্ত:

array1.length === array2.length && array1.every(function(value, index) { return value === array2[index]})

আরআর, ECMAScript 6 / কফিস্ক্রিপ্ট / টাইপ স্ক্রিপ্টে তীর ফাংশন সহ:

array1.length === array2.length && array1.every((value, index) => value === array2[index])

(দ্রষ্টব্য: 'স্কেলার' এর অর্থ এমন মানগুলি যা সরাসরি ব্যবহারের সাথে তুলনা করা যায় ===So সুতরাং: সংখ্যা, স্ট্রিং, রেফারেন্স দ্বারা অবজেক্টস, রেফারেন্স অনুসারে ফাংশন comparison তুলনা অপারেটরগুলি সম্পর্কে আরও তথ্যের জন্য MDN রেফারেন্স দেখুন)।

হালনাগাদ

আমি মন্তব্যগুলি থেকে যা পড়েছি তা থেকে অ্যারে বাছাই করা এবং তুলনা করা সঠিক ফলাফল দিতে পারে:

array1.length === array2.length && array1.sort().every(function(value, index) { return value === array2.sort()[index]});

উদাহরণ:

array1 = [2,3,1,4];
array2 = [1,2,3,4];

তারপরে উপরের কোডটি দিবে true


19
আমি এটি পছন্দ করি, যদিও পাঠকদের সচেতন হওয়া উচিত এটি কেবল বাছাই করা অ্যারেগুলিতে কাজ করে।
এলেন স্পারটাস

13
এটি @ এস্পার্টাসকে বাছাই করা বা নাজাতযুক্ত যে কোনও ধরণের অ্যারে নিয়ে কাজ করে
Michał Miszczyszyn

36
হ্যাঁ অবশ্যই. এই ফাংশনটি দুটি অ্যারের সাথে তুলনা করার কথা, এটি বাছাই করা হয় বা না তা বিবেচনা করে না, তাদের পরপর উপাদানগুলি সমান হতে হবে।
মাইচা মিস্জিজিজিন ২

22
@ এস্পার্টাস সত্যই, যদি উপাদানগুলির উভয় অ্যারেতে ঠিক একই ক্রম না থাকে তবে এটি সত্য হবে না। তবে, সমতা পরীক্ষার লক্ষ্য হ'ল তাদের একই উপাদান রয়েছে কিনা তা পরীক্ষা করা নয় তবে একই আদেশে তাদের একই উপাদান রয়েছে কিনা তা পরীক্ষা করা।
কোয়ান্টিন রায়

7
যদি আপনি উভয় অ্যারে একই অরসোর্টড আইটেম (তবে একাধিকবার ব্যবহৃত হয় না) সমান কিনা তা পরীক্ষা করতে চান তবে আপনি ব্যবহার করতে পারেন a1.length==a2.length && a1.every((v,i)=>a2.includes(v)): var a1 =[1,2,3], a2 = [3,2,1];( var a1 =[1,3,3], a2 = [1,1,3];প্রত্যাশার মতো কাজ করবে না)
মেমস

208

আমি অ্যারে / অবজেক্ট ভারী কোডিং প্রকল্পগুলির জন্য ... ইন্ডোরস্কোর এবং লোড্যাশের জন্য অ্যান্ডস্কোর লাইব্রেরিটি ব্যবহার করতে চাই আপনি আরে বা অবজেক্টের তুলনা করছেন কিনা তা ঠিক এইরকম দেখাচ্ছে:

_.isEqual(array1, array2)   // returns a boolean
_.isEqual(object1, object2) // returns a boolean

22
আদেশের বিষয়গুলি নোট করুন _.isEqual([1,2,3], [2,1,3]) => false
ভিটালিয়া আলেকাস্ক

3
অথবা আপনি যদি কেবল isEqualকার্যকারিতা চান তবে আপনি সর্বদা লড্যাশ.ইসকিউয়াল মডিউলটি ব্যবহার করতে পারেন
হেল্লান

6
আপনি _ _differences () ব্যবহার করতে পারেন; যদি আদেশটি আপনার পক্ষে গুরুত্বপূর্ণ না
রোনান কুইলভেরি

5
_.isEqual([1,2,3].sort(), [2,1,3].sort()) => true
অর্ডের কোনও গুরুত্ব নেই

সর্বাধিক সংক্ষিপ্ত এবং সোজা উত্তর IMHO :-)
কাইরান রায়ান

121

এটি আমি মনে করি এটি JSON স্ট্রিংফাই ব্যবহার করে করার সহজতম উপায় এবং এটি কিছু পরিস্থিতিতে সেরা সমাধান হতে পারে:

JSON.stringify(a1) === JSON.stringify(a2);

এটি বস্তুগুলিকে a1এবং a2স্ট্রিংগুলিতে রূপান্তর করে যাতে তাদের তুলনা করা যায়। অর্ডার বেশিরভাগ ক্ষেত্রে গুরুত্বপূর্ণ, কারণ উপরের উত্তরগুলির মধ্যে একটিতে প্রদর্শিত বাছাই করা অ্যালগরিদম ব্যবহার করে অবজেক্টটি সাজানো যেতে পারে।

দয়া করে নোট করুন যে আপনি আর বস্তুর তুলনা করছেন না তবে বস্তুর স্ট্রিং প্রতিনিধিত্ব করছেন। আপনি যা চান ঠিক তা নাও হতে পারে।


ভাল উত্তর তবে কেন [] == [] মিথ্যা প্রত্যাবর্তন করবেন? উভয়ই সরল অবজেক্ট তবে কেন?
পারদীপ জৈন

4
@ পারদীপজাইন, এটি কারণ ডিফল্টরূপে, ইসকামাস্ক্রিপ্টের অবজেক্টের জন্য সমতা অপারেটর যখন একই মেমরির অবস্থান উল্লেখ করে তখন সত্য ফিরে আসে। Var x = y = [] ব্যবহার করে দেখুন; // এখন সমতা সত্য ফিরে আসে।
র‌্যাডটেক

7
কেবল লক্ষ করুন যে JSON স্ট্রিংফাই ফাংশনটি দ্রুত নয়। বৃহত্তর অ্যারে ব্যবহার করা অবশ্যই ল্যাগটি প্রবর্তন করবে।
লুকাশ লিসিস

6
প্রশ্নটি বিশেষত জিজ্ঞাসা করে যে JSON.stringify ব্যবহারের চেয়ে আরও ভাল / দ্রুত উপায় আছে কি না way
ডন হ্যাচ

এটি কিছু পরিস্থিতিতে কেন ভাল সমাধান হতে পারে সে সম্পর্কে আরও বিশদে যায়।
র‌্যাডটেক

61

আপনি "অভিন্ন" বলতে কী বোঝায় তা অস্পষ্ট। উদাহরণস্বরূপ, অ্যারেগুলি aএবং bনীচে কী অভিন্ন (নেস্টেড অ্যারেগুলি নোট করুন)?

var a = ["foo", ["bar"]], b = ["foo", ["bar"]];

এখানে একটি অনুকূলিত অ্যারে তুলনা ফাংশন যা কঠোর সাম্য ব্যবহার করে প্রতিটি অ্যারের সম্পর্কিত উপাদানগুলির সাথে তুলনা করে এবং অ্যারে উপাদানগুলি যা তারা অ্যারে হয় তার পুনরাবৃত্ত তুলনা করে না, যার অর্থ উপরের উদাহরণস্বরূপ, arraysIdentical(a, b)ফিরে আসবে false। এটি সাধারণ ক্ষেত্রে কাজ করে, যা JSON- এবং- join()ভিত্তিক সমাধানগুলি করবে না:

function arraysIdentical(a, b) {
    var i = a.length;
    if (i != b.length) return false;
    while (i--) {
        if (a[i] !== b[i]) return false;
    }
    return true;
};

@ এএসডিএফ: "অভিন্ন" অর্থ কী তা প্রশ্ন থেকে অস্পষ্ট। স্পষ্টতই এই উত্তরটি কেবল অগভীর চেক করে। আমি একটি নোট যুক্ত করব।
টিম ডাউন

এটি অ্যারেআইডেন্টিকাল ([1, 2, [3, 2]], [1, 2, [3, 2]]) এর জন্য ব্যর্থ হয়;
গোপীনাথ শিব 13

4
@ গোপীনাথশিব: ঠিক আছে, আপনি যদি প্রত্যাশা করছেন তবেই এটি ব্যর্থ হবে true। উত্তরটি ব্যাখ্যা করে যে এটি হবে না। আপনার যদি নেস্টেড অ্যারেগুলি তুলনা করার প্রয়োজন হয় তবে আপনি সহজেই একটি পুনরাবৃত্ত চেক যুক্ত করতে পারেন।
টিম ডাউন

58

ব্যবহারিক উপায়

আমি মনে করি যে একটি নির্দিষ্ট প্রয়োগটি "ভুল" সমাধানের বিপরীতে যদি কেবল "সঠিক" ("সঠিক") হয় তবে "সঠিক পথ ™" বলা ভুল। টোমের সমাধানটি স্ট্রিং-ভিত্তিক অ্যারে তুলনার তুলনায় সুস্পষ্ট উন্নতি, তবে এর অর্থ এটি উদ্দেশ্যমূলকভাবে "সঠিক" নয় " কি অধিকার যাহাই হউক না কেন? এটি কি দ্রুততম? এটি কি সবচেয়ে নমনীয়? এটা বোঝা সবচেয়ে সহজ? এটি ডিবাগ করার দ্রুততম কি? এটি কি সর্বনিম্ন অপারেশনগুলি ব্যবহার করে? এর কি কোনও পার্শ্ব প্রতিক্রিয়া আছে? কোন একটি সমাধান সব জিনিস সেরা হতে পারে।

টমস তার সমাধানটি দ্রুত বলতে পারে তবে আমি এটিও বলব যে এটি অযথা জটিল। এটি একটি সর্বস্তর সমাধান হতে চেষ্টা করে যা সমস্ত অ্যারে বাসা বাঁধার জন্য বা না করে কাজ করে। আসলে, এটি এমনকি ইনপুট হিসাবে কেবল অ্যারের চেয়েও বেশি গ্রহণ করে এবং এখনও একটি "বৈধ" উত্তর দেওয়ার চেষ্টা করে।


জেনারিকস পুনরায় ব্যবহারযোগ্যতার প্রস্তাব দেয়

আমার উত্তর সমস্যাটি ভিন্নভাবে পৌঁছে দেবে। আমি একটি জেনেরিক arrayCompareপ্রক্রিয়া শুরু করব যা কেবল অ্যারেগুলিতে পদক্ষেপ নেওয়ার সাথে সম্পর্কিত। সেখান থেকে আমরা আমাদের অন্যান্য মৌলিক তুলনা ফাংশনগুলি তৈরি করব arrayEqualএবং arrayDeepEqualইত্যাদি

// arrayCompare :: (a -> a -> Bool) -> [a] -> [a] -> Bool
const arrayCompare = f => ([x,...xs]) => ([y,...ys]) =>
  x === undefined && y === undefined
    ? true
    : Boolean (f (x) (y)) && arrayCompare (f) (xs) (ys)

আমার মতে, সেরা ধরণের কোডের এমনকি মন্তব্যগুলিরও প্রয়োজন হয় না এবং এটি কোনও ব্যতিক্রম নয়। এখানে খুব সামান্য ঘটনা ঘটছে যে আপনি প্রায় কোনও প্রচেষ্টা ছাড়াই এই পদ্ধতির আচরণ বুঝতে পারবেন। অবশ্যই, কিছু ES6 সিনট্যাক্স আপনার কাছে এখন বিদেশী বলে মনে হতে পারে তবে এটি কেবল কারণ ES6 অপেক্ষাকৃত নতুন।

প্রকারটি যেমন প্রস্তাব দেয়, arrayCompareতুলনা ফাংশন নেয় fএবং দুটি ইনপুট অ্যারে xsএবং ys। বেশিরভাগ ক্ষেত্রে, আমরা যা করি তা হ'ল f (x) (y)ইনপুট অ্যারেগুলির প্রতিটি উপাদানকে কল করা । আমরা সংক্ষিপ্ত-সার্কিট মূল্যায়নের জন্য ধন্যবাদ - falseযদি ব্যবহারকারী সংজ্ঞায়িত fফেরত দেয় তবে আমরা তাড়াতাড়ি ফিরে আসি। হ্যাঁ, এর অর্থ এটি হল তুলনাকারী পুনরুত্থানগুলি বন্ধ করতে পারে এবং অপ্রয়োজনীয় হলে বাকী ইনপুট অ্যারের মাধ্যমে লুপিং রোধ করতে পারে।false&&


কঠোর তুলনা

এর পরে, আমাদের arrayCompareফাংশনটি ব্যবহার করে আমরা সহজেই আমাদের প্রয়োজন অন্যান্য ফাংশন তৈরি করতে পারি। আমরা প্রাথমিক দিয়ে শুরু করব arrayEqual...

// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false

যে হিসাবে সহজ। arrayEqualসঙ্গে সংজ্ঞায়িত করা যায় arrayCompareএবং একটি comparator ফাংশন যা তুলনা aকরতে bব্যবহার ===(প্রখর সমতা জন্য)।

লক্ষ্য করুন যে আমরা equalএটির নিজস্ব কার্যকারিতা হিসাবেও সংজ্ঞা দিই । এটি arrayCompareঅন্য ডেটা টাইপের (অ্যারে) প্রসঙ্গে আমাদের প্রথম অর্ডার তুলককে কাজে লাগানোর জন্য উচ্চ-অর্ডার ক্রিয়াকলাপের ভূমিকাটিকে হাইলাইট করে ।


আলগা তুলনা

আমরা শুধু সহজে সংজ্ঞায়িত পারে arrayLooseEqualএকটি ব্যবহার ==পরিবর্তে। এখন 1(সংখ্যা) সাথে '1'(স্ট্রিং) তুলনা করার সময় ফলাফলটি হবে true

// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true

গভীর তুলনা (পুনরাবৃত্ত)

আপনি সম্ভবত লক্ষ্য করেছেন যে এটি কেবল অগভীর তুলনা। নিশ্চয় টমের সমাধান "সঠিক পথ ™" কারণ এটি নিবিড় গভীর তুলনা করে, তাই না?

ভাল, আমাদের arrayCompareপদ্ধতিটি এমন একটি উপায়ে ব্যবহারের পক্ষে যথেষ্ট বহুমুখী যা গভীর সমতা পরীক্ষাকে একটি বাতাস তৈরি করে…

// isArray :: a -> Bool
const isArray =
  Array.isArray

// arrayDeepCompare :: (a -> a -> Bool) -> [a] -> [a] -> Bool
const arrayDeepCompare = f =>
  arrayCompare (a => b =>
    isArray (a) && isArray (b)
      ? arrayDeepCompare (f) (a) (b)
      : f (a) (b))

const xs = [1,[2,[3]]]
const ys = [1,[2,['3']]]
console.log (arrayDeepCompare (equal) (xs) (ys)) //=> false
// (1 === 1) && (2 === 2) && (3 === '3')         //=> false

console.log (arrayDeepCompare (looseEqual) (xs) (ys)) //=> true
// (1 == 1) && (2 == 2) && (3 == '3')                 //=> true

যে হিসাবে সহজ। আমরা আরও একটি উচ্চতর অর্ডার ফাংশন ব্যবহার করে একটি গভীর তুলনামূলক তৈরি করি । এই সময় আমরা মোড়কে করছি arrayCompareযে যদি চেক করবে একটি কাস্টম comparator ব্যবহার aএবং bঅ্যারে আছে। যদি তা হয় তবে arrayDeepCompareঅন্যথায় পুনরায় আবেদন করুন aএবং bব্যবহারকারী-নির্দিষ্ট করা তুলনা ( f) এর সাথে তুলনা করুন । এটি আমাদের পৃথক উপাদানগুলিকে আসলে কীভাবে তুলনা করে তার থেকে গভীর তুলনা আচরণকে আলাদা রাখতে দেয়। অর্থাত, শো উপরোক্ত উদাহরণে মতো আমরা গভীর ব্যবহার তুলনা করতে পারবেন equal, looseEqual, বা অন্য কোন comparator আমরা ভুলবেন না।

কারণ arrayDeepCompareতরকারিযুক্ত, আমরা পূর্ববর্তী উদাহরণগুলিতেও এর মতো আংশিকভাবে প্রয়োগ করতে পারি

// arrayDeepEqual :: [a] -> [a] -> Bool
const arrayDeepEqual =
  arrayDeepCompare (equal)

// arrayDeepLooseEqual :: [a] -> [a] -> Bool
const arrayDeepLooseEqual =
  arrayDeepCompare (looseEqual)

আমার কাছে টোমের সমাধানের তুলনায় এটি ইতিমধ্যে সুস্পষ্ট উন্নতি কারণ প্রয়োজনীয় হিসাবে আমি পরিষ্কারভাবে আমার অ্যারেগুলির জন্য অগভীর বা গভীর তুলনা বেছে নিতে পারি।


বস্তুর তুলনা (উদাহরণ)

এখন যদি আপনার কাছে কিছু জিনিস বা কিছু থাকে? আপনি যদি সেই অ্যারেগুলিকে "সমান" হিসাবে বিবেচনা করতে চান তবে প্রতিটি বস্তুর একই idমান থাকে ...

// idEqual :: {id: Number} -> {id: Number} -> Bool
const idEqual = x => y =>
  x.id !== undefined && x.id === y.id

// arrayIdEqual :: [a] -> [a] -> Bool
const arrayIdEqual =
  arrayCompare (idEqual)

const xs = [{id:1}, {id:2}]
const ys = [{id:1}, {id:2}]
console.log (arrayIdEqual (xs) (ys)) //=> true
// (1 === 1) && (2 === 2)            //=> true

const zs = [{id:1}, {id:6}]
console.log (arrayIdEqual (xs) (zs)) //=> false
// (1 === 1) && (2 === 6)            //=> false

যে হিসাবে সহজ। এখানে আমি ভ্যানিলা জেএস অবজেক্ট ব্যবহার করেছি তবে এই ধরণের তুলনামূলক যে কোনও অবজেক্টের জন্য কাজ করতে পারে ; এমনকি আপনার কাস্টম অবজেক্ট। এই ধরণের সাম্যতা পরীক্ষাকে সমর্থন করার জন্য টমের সমাধানটিকে সম্পূর্ণভাবে পুনরায় কাজ করা দরকার

বস্তুর সাথে গভীর অ্যারে? কোন সমস্যা নেই. আমরা অত্যন্ত বহুমুখী, জেনেরিক ফাংশন তৈরি করেছি, যাতে তারা বিভিন্ন ধরণের ব্যবহারের ক্ষেত্রে কাজ করবে।

const xs = [{id:1}, [{id:2}]]
const ys = [{id:1}, [{id:2}]]
console.log (arrayCompare (idEqual) (xs) (ys))     //=> false
console.log (arrayDeepCompare (idEqual) (xs) (ys)) //=> true

নির্বিচার তুলনা (উদাহরণ)

বা আপনি যদি অন্য কোনও ধরণের সম্পূর্ণ স্বেচ্ছাসেবী তুলনা করতে চান? প্রতিটি আমি প্রত্যেকের xচেয়ে বড় কিনা তা জানতে চাই y...

// gt :: Number -> Number -> Bool
const gt = x => y =>
  x > y

// arrayGt :: [a] -> [a] -> Bool
const arrayGt = arrayCompare (gt)

const xs = [5,10,20]
const ys = [2,4,8]
console.log (arrayGt (xs) (ys))     //=> true
// (5 > 2) && (10 > 4) && (20 > 8)  //=> true

const zs = [6,12,24]
console.log (arrayGt (xs) (zs))     //=> false
// (5 > 6)                          //=> false

কমই বেশি

আপনি দেখতে পাচ্ছেন আমরা আসলে কম কোড দিয়ে আরও কিছু করছি। arrayCompareনিজের সম্পর্কে জটিল কিছু নেই এবং আমরা তৈরি কাস্টম তুলকগুলির একটি খুব সাধারণ বাস্তবায়ন হয়েছে।

স্বচ্ছন্দে সঙ্গে, আমরা সংজ্ঞায়িত করতে পারেন ঠিক দুইটি অ্যারের তুলনা করা যেতে করার জন্য আমরা কিভাবে ইচ্ছুক - অগভীর, গভীর, কঠোর, আলগা, কিছু বস্তু সম্পত্তি, অথবা কিছু নির্বিচারে গণনার, অথবা এইসব কোনো সমন্বয় - সব এক পদ্ধতি ব্যবহার করে , arrayCompare। এমনকি স্বপ্ন RegExpতুলনা করতে পারে ! আমি জানি বাচ্চারা কীভাবে এই পুনঃসংশ্লিষ্টগুলিকে ভালবাসে ...

এটি কি দ্রুততম? নাঃ। তবে এটি সম্ভবত হওয়ার দরকার নেই। গতি যদি আমাদের কোডের মান পরিমাপ করতে ব্যবহৃত একমাত্র মেট্রিক হয় তবে প্রচুর দুর্দান্ত কোড ফেলে দেওয়া হবে - এজন্যই আমি এই পদ্ধতির প্র্যাকটিকাল ওয়ে বলছি । বা হতে পারে আরও সুষ্ঠু, একটি প্রাকৃতিক উপায়। এই বিবরণটি এই উত্তরের জন্য উপযুক্ত কারণ আমি বলছি না যে এই উত্তরটি অন্য কোনও উত্তরের তুলনায় কেবল ব্যবহারিক; এটা উদ্দেশ্যমূলকভাবে সত্য। আমরা খুব অল্প কোডের সাথে একটি উচ্চতর ডিগ্রি অর্জন করেছি যার পক্ষে যুক্তিযুক্ত খুব সহজ। অন্য কোনও কোড বলতে পারে না যে আমরা এই বিবরণটি অর্জন করিনি।

এটি কি এটিকে আপনার জন্য "সঠিক" সমাধান হিসাবে তৈরি করে? জন্য যে খবর আপনি সিদ্ধান্ত নিতে। এবং অন্য কেউ আপনার পক্ষে এটি করতে পারে না; আপনার প্রয়োজনগুলি কী তা কেবল আপনি জানেন। প্রায় সব ক্ষেত্রেই আমি চতুর এবং দ্রুত ধরণের চেয়ে সোজা, ব্যবহারিক এবং বহুমুখী কোডকে গুরুত্ব দিয়েছি। আপনি যা মূল্য দেন তার থেকে আলাদা হতে পারে, তাই আপনার জন্য কী কাজ করে তা চয়ন করুন।


সম্পাদন করা

আমার পুরানো উত্তরটি arrayEqualক্ষুদ্রতর প্রক্রিয়াগুলিতে ক্ষয় করার দিকে বেশি মনোনিবেশ করেছিল । এটি একটি আকর্ষণীয় অনুশীলন, তবে এই সমস্যাটির কাছে যাওয়ার সর্বোত্তম (সবচেয়ে ব্যবহারিক) উপায় নয়। আপনি যদি আগ্রহী হন তবে আপনি এই পুনর্বিবেচনার ইতিহাসটি দেখতে পারেন।


8
"সেরা ধরণের কোড এমনকি মন্তব্যগুলিরও প্রয়োজন হয় না" ... এটি বলা ঘৃণাজনক, তবে এই কোডটি একটি মন্তব্য বেশি ব্যবহার করতে পারে এবং / অথবা একটি আলাদা নাম - "তুলনা" বেশ অস্পষ্ট। আমি যদি সঠিকভাবে পড়ছি তবে আপনার "তুলনা" মূলত একটি কৌতুকপূর্ণ পুনরাবৃত্ত "প্রতিটি"। আমি মনে করি. নাকি এটি একটি কৌতুহলী পুনরাবৃত্তি "কিছু"? হুম। এটি প্রয়োজনের চেয়ে বেশি চিন্তাভাবনার প্রয়োজন। "সমতুল্য সম্পর্ক" এর স্ট্যান্ডার্ড পরিভাষাটি লাভ করে সম্ভবত আরও ভাল নাম "অ্যারেএকুইভ্যালেন্ট" হবে। বা, এমনকি পরিষ্কার (আমার কাছে যাই হোক না কেন), "পুনরাবৃত্তিমূলক উত্সাহী"।
ডন হ্যাচ

1
@ ডনহ্যাচ উত্তর দেওয়ার সুযোগের জন্য ধন্যবাদ। "তুলনা" দ্বারা আপনি কি বোঝাতে চান arrayCompare? হ্যাঁ ফাংশন curried, কিন্তু এটা থেকে পৃথক someএবং every। তুলনা করতে arrayCompareএকটি তুলক এবং দুটি অ্যারে লাগে takes আমি একটি বিশেষ জেনেরিক নাম বেছে নিয়েছি কারণ আমরা যেকোন স্বেচ্ছাসেবী ফাংশন ব্যবহার করে অ্যারেগুলি তুলনা করতে পারি। ফাংশনটি কারিড করা তাই এটি নতুন অ্যারে তুলনা ফাংশন (যেমন, arrayEqual) তৈরি করতে বিশেষীকরণ করা যায় । আপনি কি আরও ভাল নাম প্রস্তাব করতে পারেন? কোন ক্ষেত্রগুলিতে আপনার অতিরিক্ত মন্তব্য বা ব্যাখ্যা দরকার বলে মনে হচ্ছে? আমি discuss _ ^ আলোচনা করতে পেরে খুশি
আপনাকে ধন্যবাদ 1

1
আমার বক্তব্যটি এখনও পরিষ্কার কিনা তা নিশ্চিত নন - তবে আমার বক্তব্যটি হল, আপনার ফাংশনটি আসলেই একটি স্বেচ্ছাসেবী ফাংশন গ্রহণের উদ্দেশ্যে নয় , আমি মনে করি না - এটি একটি সমতা সম্পর্ক গ্রহণের উদ্দেশ্যে এবং এটি একটি সমতুল্য সম্পর্ক ফিরিয়ে দেয়। এটি গুরুত্বপূর্ণ - এটি আমি যেগুলি উল্লেখ করেছি তার মতো কিছু অন্যরকম স্বেচ্ছাচারী বাইনারি ফাংশন দেওয়া থাকলেও এটি বোধগম্য কিছু করতে পারে না (আমি মনে করি না) এমনকি লোকেরা প্রায়শই "তুলনা" বলে। সুতরাং আমি মনে করি "তুলনা" এর জায়গায় "সমতুল্য" নামটি রাখা সহায়ক হবে।
ডন হ্যাচ

1
@ ফোর, লেখক: দুর্দান্ত সহায়ক উত্তর, সুন্দর কাজ, +1। প্রতিক্রিয়া: আপনি সরলতার পক্ষে, তবে কোনও উপায়ই এক লাইনে তিনটি তীর সহ একটি অভিব্যক্তি নয় যা অনেক বিকাশকারীদের পক্ষে সহজ বা সহজে বোঝা যায়। যেমন: f => ([x, ... xs]) => ([y, ... ys]) =>। আমি ক্রমাগত এটি ব্যবহার করি এবং এখনও "কেবল এটি দেখুন" এর চেয়ে মানসিকভাবে এটি পচন করতে হয়েছিল। দ্বিতীয় পয়েন্ট ftor ঠিক আছে, প্রতিটি ব্যবহার করুন। এমনকি আপনার কারণে ওজনকে ভারসাম্য বজায় রাখা কেবল আমার কাছেই নয়, আপনার নকশার দর্শনের অনুমানের চেষ্টা করার সময় আপনার দৃষ্টিভঙ্গি থেকেও ভাল বলে মনে হয়।
হোয়াইটনিল্যান্ড

1
আমি বুঝতে পারি এটি শেখার জন্য একটি জায়গা, তবে আমি এখানে একটি অনুমান করি যে কার্যকরী শৈলীর অধ্যয়নরত গড় প্রোগ্রামার যে কোনও ত্রিযুক্ত ফাংশনটিকে অনাহুত অবস্থায় রূপান্তর করতে পারে। আমার উত্তরটি এই পরামর্শটি দেয় না যে এই স্টাইলটি আপনার নিজের প্রোগ্রামে ব্যবহৃত হতে পারে - এটি অনাকাঙ্ক্ষিতভাবে লিখুন, এটি আপনার নিজের ইন্ডেন্টেশন বিধিগুলি ব্যবহার করে লিখুন, আপনি চান তবে লিখুন - আমি আমার উত্তরগুলি এমন একটি স্টাইলে লিখি যা আমি বিশ্বাস করি যে এটি প্রকাশ করে প্রোগ্রাম সেরা। আমরা আমাদের কর্মসূচিকে সিন্ট্যাক্টিকভাবে যেভাবে প্রকাশ করি তা চ্যালেঞ্জ জানাতে অন্যদের আমন্ত্রণ জানাতে চাই
ধন্যবাদ

54

মূল প্রশ্নের চেতনায়:

আমি দুটি অ্যারে তুলনা করতে চাই ... আদর্শভাবে, দক্ষতার সাথেঅভিনব কিছুই নয় , যদি তারা অভিন্ন হয় তবে সত্য এবং যদি তা না হয় তবে তা মিথ্যা।

আমি নীচের ফলাফলগুলি (দ্রুত থেকে ধীরে ধীরে) এর সাথে প্রস্তাবিত আরও কয়েকটি সাধারণ পরামর্শগুলির উপর পারফরম্যান্স পরীক্ষা চালিয়ে যাচ্ছি :

টিম ডাউন দ্বারা (67%) যখন

var i = a1.length;
while (i--) {
    if (a1[i] !== a2[i]) return false;
}
return true

ব্যবহারকারী 2782196 দ্বারা প্রতি (69%)

a1.every((v,i)=> v === a2[i]);

ডিআইআই দ্বারা হ্রাস (74%)

a1.reduce((a, b) => a && a2.includes(b), true);

গাইজকা অ্যালেন্ডে এবং বিবেকের দ্বারা & টস্ট্রিং (78%) এ যোগদান করুন

a1.join('') === a2.join('');

a1.toString() === a2.toString();

ভিক্টর পালোমো দ্বারা অর্ধ toString (90%)

a1 == a2.toString();

স্ট্রিংফাইড (100%) দ্বারা রাডটেক

JSON.stringify(a1) === JSON.stringify(a2);

নীচের উদাহরণগুলি নোট করুন অনুমান করুন অ্যারেগুলি সাজানো হয়েছে, একক-মাত্রিক অ্যারেগুলি। .lengthতুলনাটি একটি সাধারণ বেঞ্চমার্কের জন্য সরানো হয়েছে ( a1.length === a2.lengthকোনও পরামর্শে যুক্ত করুন এবং আপনি একটি% 10% পারফরম্যান্স বুস্ট পাবেন)। প্রত্যেকটির গতি এবং সীমাবদ্ধতা জেনে আপনার জন্য যে কার্যকর সমাধান সবচেয়ে কার্যকর তা চয়ন করুন।

নিরপেক্ষ নোট: এই প্রশ্নের সঠিক বৈধ উত্তরের জন্য লোকে ডাউন ভোট বোতামে সমস্ত ট্রিগার-হ্যাপি জন ওয়েইনকে দেখতে পাওয়া আকর্ষণীয়।


লিঙ্কটি একটি খালি পরীক্ষা খুলবে।
আলেকজান্ডার আবাকুমভ

আপনি যদি অ্যারের আকারটিকে ঘুঘু করেন তবে এই সংখ্যাগুলি প্রয়োগ হয় না (বিশেষত হ্রাস পদ্ধতির)। Try Array.from({length: 1000}).map((a,v)=> {v with দিয়ে চেষ্টা করুন.padStart(10,2));
নারায়ণ

এটি কেবল অগভীর অ্যারে জন্য কাজ করে
রমেশ রাজেন্দ্রন

28

টোম জ্যাটো এর উত্তর বন্ধ করে, আমি সম্মত হই যে কেবল অ্যারেগুলির মাধ্যমে পুনরাবৃত্তি করা সবচেয়ে দ্রুত। অতিরিক্ত হিসাবে (অন্যদের মতো ইতিমধ্যে জানিয়েছে), ফাংশনটিকে তুলনা না করে সমান / সমান বলা উচিত। এর আলোকে, আমি অনুরূপতার জন্য অ্যারেগুলি তুলনা করার জন্য ফাংশনটি সংশোধন করেছি - অর্থাত্ তাদের ব্যবহারকারীর জন্য একই উপাদান রয়েছে তবে অর্ডারের বাইরে - এবং ভেবেছিলাম সবাইকে দেখার জন্য আমি এটি এখানে ফেলে দেব।

Array.prototype.equals = function (array, strict) {
    if (!array)
        return false;

    if (arguments.length == 1)
        strict = true;

    if (this.length != array.length)
        return false;

    for (var i = 0; i < this.length; i++) {
        if (this[i] instanceof Array && array[i] instanceof Array) {
            if (!this[i].equals(array[i], strict))
                return false;
        }
        else if (strict && this[i] != array[i]) {
            return false;
        }
        else if (!strict) {
            return this.sort().equals(array.sort(), true);
        }
    }
    return true;
}

এই ফাংশনটি কঠোর একটি অতিরিক্ত পরামিতি নেয় যা সত্যের ডিফল্ট হয়। এই কড়া পরামিতিটি সংজ্ঞায়িত করে যদি অ্যারেগুলি উভয় সামগ্রীতে এবং সেগুলির সামগ্রীর ক্রমে সম্পূর্ণ সমান হওয়া দরকার বা কেবল একই বিষয়বস্তু ধারণ করে।

উদাহরণ:

var arr1 = [1, 2, 3, 4];
var arr2 = [2, 1, 4, 3];  // Loosely equal to 1
var arr3 = [2, 2, 3, 4];  // Not equal to 1
var arr4 = [1, 2, 3, 4];  // Strictly equal to 1

arr1.equals(arr2);         // false
arr1.equals(arr2, false);  // true
arr1.equals(arr3);         // false
arr1.equals(arr3, false);  // false
arr1.equals(arr4);         // true
arr1.equals(arr4, false);  // true

আমি ফাংশন এবং এই উদাহরণটি দিয়ে একটি দ্রুত jsfiddle লিখেছি:
http://jsfiddle.net/Roundaround/DLkxX/


12

যদিও এর অনেক উত্তর রয়েছে তবে আমি বিশ্বাস করি যে এটি সহায়ক হবে:

const newArray = [ ...new Set( [...arr1, ...arr2] ) ]

অ্যারেটির কাঠামোটি কেমন দেখায় তা প্রশ্নের মধ্যে বলা হয়নি, সুতরাং আপনি যদি নিশ্চিতরূপে জানেন যে আপনার অ্যারেতে নেস্টেড অ্যারে বা অবজেক্ট থাকবে না (এটি আমার ক্ষেত্রে হয়েছিল, সে কারণেই আমি এখানে এসেছি উত্তর) উপরের কোডটি কাজ করবে।

যা ঘটে তা হ'ল আমরা উভয় অ্যারে সংশ্লেষ করতে স্প্রেড অপারেটর (...) ব্যবহার করি, তারপরে আমরা কোনও নকলকে অপসারণ করতে সেট ব্যবহার করি। আপনার কাছে একবার আপনি তাদের আকারগুলি তুলনা করতে পারবেন, যদি তিনটি অ্যারে একই আকার হয় তবে আপনি ভাল good

এই উত্তরটিও উপাদানগুলির ক্রমটিকে উপেক্ষা করে , যেমনটি আমি বলেছিলাম, আমার সাথে যথাযথ পরিস্থিতি ঘটেছে, তাই সম্ভবত একই পরিস্থিতিতে কেউ এখানে এসে থাকতে পারে (যেমন আমি করেছি)।


Edit1।

দিমিত্রি গ্রিঙ্কোর প্রশ্নের উত্তরে: "আপনি এখানে স্প্রেড অপারেটর (...) কেন ব্যবহার করেছেন - ... নতুন সেট? এটি কাজ করে না"

এই কোডটি বিবেচনা করুন:

const arr1 = [ 'a', 'b' ]
const arr2 = [ 'a', 'b', 'c' ]
const newArray = [ new Set( [...arr1, ...arr2] ) ]
console.log(newArray)

তুমি পাবে

[ Set { 'a', 'b', 'c' } ]

এই মানটির সাথে কাজ করার জন্য আপনাকে কিছু সেট বৈশিষ্ট্য ব্যবহার করতে হবে ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/ গ্লোবাল_অবজেক্টস / সেট ) দেখুন। অন্যদিকে, আপনি যখন এই কোডটি ব্যবহার করেন:

const arr1 = [ 'a', 'b' ]
const arr2 = [ 'a', 'b', 'c' ]
const newArray = [ ...new Set( [...arr1, ...arr2] ) ]
console.log(newArray)

তুমি পাবে

[ 'a', 'b', 'c' ]

পার্থক্যটি, প্রাক্তন আমাকে একটি সেট দিতেন, আমি সেই সেটটির আকার পেতে পারি বলে এটি খুব কার্যকর হবে তবে পরবর্তীটি আমাকে প্রয়োজনীয় অ্যারে দেয়, রেজোলিউশনে আরও সরাসরি কী।


আপনি এখানে স্প্রেড অপারেটর (...) কেন ব্যবহার করেছেন - ... নতুন সেট? এটি কাজ করে না।
দিমিত্রি গ্রিঙ্কো

দিমিত্রি গ্রিঙ্কো আমি বিশ্বাস করি যে আমি আপনার প্রশ্নের উত্তর আমার সম্পাদনাতে দিয়েছি। তবে আমি নিশ্চিত নই যে আপনি 'এটি কাজ করে না' বলার অর্থ কী, কারণ উভয় উত্তরই আপনাকে পেতে পারে
জেফারস ইউক্লিডস

10

JSON.encode তে একই লাইনে যোগ () যোগ করতে হবে।

function checkArrays( arrA, arrB ){

    //check if lengths are different
    if(arrA.length !== arrB.length) return false;


    //slice so we do not effect the original
    //sort makes sure they are in order
    //join makes it a string so we can do a string compare
    var cA = arrA.slice().sort().join(","); 
    var cB = arrB.slice().sort().join(",");

    return cA===cB;

}

var a = [1,2,3,4,5];
var b = [5,4,3,2,1];
var c = [1,2,3,4];
var d = [1,2,3,4,6];
var e = ["1","2","3","4","5"];  //will return true

console.log( checkArrays(a,b) );  //true
console.log( checkArrays(a,c) );  //false
console.log( checkArrays(a,d) );  //false
console.log( checkArrays(a,e) );  //true

কেবলমাত্র সমস্যাটি যদি আপনি সেই ধরণের বিষয়ে চিন্তা করেন যা সর্বশেষ তুলনা পরীক্ষা করে। আপনি যদি ধরণের বিষয়ে যত্নশীল হন তবে আপনাকে লুপ করতে হবে।

function checkArrays( arrA, arrB ){

    //check if lengths are different
    if(arrA.length !== arrB.length) return false;

    //slice so we do not effect the orginal
    //sort makes sure they are in order
    var cA = arrA.slice().sort(); 
    var cB = arrB.slice().sort();

    for(var i=0;i<cA.length;i++){
         if(cA[i]!==cB[i]) return false;
    }

    return true;

}

var a = [1,2,3,4,5];
var b = [5,4,3,2,1];
var c = [1,2,3,4];
var d = [1,2,3,4,6];
var e = ["1","2","3","4","5"];

console.log( checkArrays(a,b) );  //true
console.log( checkArrays(a,c) );  //false
console.log( checkArrays(a,d) );  //false
console.log( checkArrays(a,e) );  //false

যদি আদেশটি একই থাকে তবে এটি কেবল একটি লুপ নয়, কোনও সাজানোর প্রয়োজন হয় না।

function checkArrays( arrA, arrB ){

    //check if lengths are different
    if(arrA.length !== arrB.length) return false;


    for(var i=0;i<arrA.length;i++){
         if(arrA[i]!==arrB[i]) return false;
    }

    return true;

}

var a = [1,2,3,4,5];
var b = [5,4,3,2,1];
var c = [1,2,3,4];
var d = [1,2,3,4,6];
var e = ["1","2","3","4","5"];

console.log( checkArrays(a,a) );  //true
console.log( checkArrays(a,b) );  //false
console.log( checkArrays(a,c) );  //false
console.log( checkArrays(a,d) );  //false
console.log( checkArrays(a,e) );  //false

3
এটি কেবল নির্দিষ্ট অ্যারেগুলির জন্যই কাজ করে এবং বড় অ্যারেগুলির সাথে খুব ধীর হবে।
টোমা জ্যাটো -

2
জেএসওএন তৈরি করাও লুপিং করছে, আপনি কেবল (বা এটি মনে হয়) এটি সম্পর্কে জানেন না। লুপিংয়ের পাশাপাশি, জেএসএন উত্পন্ন করার জন্য আরও মেমরি প্রয়োজন - এটি তুলনা করার আগে বলেন অ্যারেগুলির দুটি স্ট্রিং উপস্থাপনা তৈরি করে। ডাউনওট ফাংশনটি উত্তর থেকে সেরা থেকে খারাপের অর্ডার দেওয়ার জন্য প্রয়োগ করা হয়। আমি মনে করি আপনার উত্তরটি ভাল উত্তর নয়, তাই আমি এটিকে হ্রাস করেছি।
টোমা জ্যাটো - মনিকা

2
দুঃখিত, আমি কেবল JSON এর পরিবর্তে বলেছি .join() । হতে পারে আপনি যদি দ্বিতীয় সমাধানটিকে প্রাথমিক হিসাবে বর্ণনা করেন (তবে এটি একাধিকতর ভাল তবে বহুমাত্রিক অ্যারেগুলির তুলনায় দাঁতবিহীন), আমি আপনাকে সেভাবে বিচার করব না। এখনও অবধি, আমি সমস্ত উত্তরগুলি ডাউনটেট করেছি যা অ্যারেগুলিকে স্ট্রিংয়ে রূপান্তরিত করে। পাশাপাশি, আমি সঠিকভাবে ব্যবহার করা সমস্তগুলিকে উজ্জীবিত করেছি, যদি আপনার জানার প্রয়োজন হয়। এর অর্থ @ টিম ডাউন এর উত্তর এবং বিরস একটি।
টোমা জ্যাটো - মনিকা

6
প্রথম সংস্করণ ব্যর্থ: checkArrays([1,2,3] , ["1,2",3]) == trueএবং এটি খুব সম্ভবত যে আপনি ঘটতে চান তা খুব সম্ভবত!
Doin থেকে

2
@ পেসকারেলো: হ্যাঁ, আপনি করতে পারেন (তবে আপনি যে দীর্ঘ দীর্ঘ বিভাজনের প্রস্তাব দিয়েছেন তার অদক্ষতা বাদে) এর অর্থ এখানে প্রান্তের মামলাগুলি হবে (যেখানে অ্যারেতে এটির সাথে আপনার বিভাজকের সাথে একটি স্ট্রিং রয়েছে) যেখানে চেকআররে () ফাংশনটি খারাপ ব্যবহার করে । অ্যারেগুলির বিষয়বস্তু সম্পর্কে আপনি কিছু জানেন তবে এই সমস্যাটি নাও হতে পারে (যাতে আপনি আলাদা করে বেছে নিতে পারেন যে আপনি নিশ্চিত অ্যারের আইটেমগুলিতে থাকবেন না) তবে আপনি যদি সাধারণ অ্যারে-তুলনা লেখার চেষ্টা করছেন ফাংশন, তারপরে join()এটির মতো ব্যবহার এটি সূক্ষ্মভাবে বগি তৈরি করে!
Doin থেকে

7

এখানে একটি টাইপস্ক্রিপ্ট সংস্করণ:

//https://stackoverflow.com/a/16436975/2589276
export function arraysEqual<T>(a: Array<T>, b: Array<T>): boolean {
    if (a === b) return true
    if (a == null || b == null) return false
    if (a.length != b.length) return false

    for (var i = 0; i < a.length; ++i) {
        if (a[i] !== b[i]) return false
    }
    return true
}

//https://stackoverflow.com/a/16436975/2589276
export function arraysDeepEqual<T>(a: Array<T>, b: Array<T>): boolean {
    return JSON.stringify(a) === JSON.stringify(b)
}

মোচার জন্য কয়েকটি পরীক্ষার কেস:

it('arraysEqual', function () {
    let a = [1,2]
    let b = [1,2]
    let c = [2,3]
    let d = [2, 3]
    let e = ['car','apple','banana']
    let f = ['car','apple','banana']
    let g = ['car','apple','banan8']

    expect(arraysEqual(a, b)).to.equal(true)
    expect(arraysEqual(c, d)).to.equal(true)
    expect(arraysEqual(a, d)).to.equal(false)
    expect(arraysEqual(e, f)).to.equal(true)
    expect(arraysEqual(f, g)).to.equal(false)
})

it('arraysDeepEqual', function () {
    let a = [1,2]
    let b = [1,2]
    let c = [2,3]
    let d = [2, 3]
    let e = ['car','apple','banana']
    let f = ['car','apple','banana']
    let g = ['car','apple','banan8']
    let h = [[1,2],'apple','banan8']
    let i = [[1,2],'apple','banan8']
    let j = [[1,3],'apple','banan8']

    expect(arraysDeepEqual(a, b)).to.equal(true)
    expect(arraysDeepEqual(c, d)).to.equal(true)
    expect(arraysDeepEqual(a, d)).to.equal(false)
    expect(arraysDeepEqual(e, f)).to.equal(true)
    expect(arraysDeepEqual(f, g)).to.equal(false)
    expect(arraysDeepEqual(h, i)).to.equal(true)
    expect(arraysDeepEqual(h, j)).to.equal(false)
})

6

আপনি যদি চায়ের দৃ library় গ্রন্থাগারের সাথে মোচার মতো একটি পরীক্ষামূলক কাঠামো ব্যবহার করছেন তবে আপনি অ্যারের তুলনায় গভীর সমতা ব্যবহার করতে পারেন ।

expect(a1).to.deep.equal(a2)

এটি যদি ঠিক সূচিত হয় তবেই যদি সূচকগুলিতে একই সূচকগুলিতে সমান উপাদান থাকে।


6

যদি তারা কেবল দুটি সংখ্যার অ্যারে বা স্ট্রিং হয় তবে এটি একটি দ্রুত এক-লাইন

const array1 = [1, 2, 3];
const array2 = [1, 3, 4];
console.log(array1.join(',') === array2.join(',')) //false

const array3 = [1, 2, 3];
const array4 = [1, 2, 3];
console.log(array3.join(',') === array4.join(',')) //true

কনস্ট অ্যারে 1 = [1]; কনস্ট অ্যারে 2 = [1, 1]; কনসোল.লগ (array1.join ('') === অ্যারে 2.জয়েন ('')) // প্রত্যাবর্তন সত্য
ড্যান এম।

এটি হওয়া উচিত নয়: অ্যারে 1. জোইন ('') '1' এবং অ্যারে 2. জোইন ('') '11'
গাইজকা অ্যালেন্ডে

দুঃখিত, টাইপো প্রথম অ্যারে হওয়া উচিত [11]। এটি কেন ঘটে এবং কীভাবে ঠিক করা যায় তা সম্পর্কে অত্যন্ত সুস্পষ্ট।
ড্যান এম।

.Join () হল "1" এবং [1,1] .join () "1,1" তাই তারা কখনো সমান হতে পাবেন [1]: কোনো নিশ্চিত করুন যে আপনি কি করছেন সেটি সম্পর্কে, এটা বেশ সহজ
Gaizka আলেন্দে

দয়া করে, আমার মন্তব্যটি আরও মনোযোগ সহকারে পড়ুন। আপনি যদি এখনও এটি না দেখেন তবে দয়া করে আদর্শের উপর
ড্যান এম।

5

আমার ক্ষেত্রে তুলনা করা অ্যারেতে কেবল সংখ্যা এবং স্ট্রিং থাকে। অ্যারেতে একই উপাদান রয়েছে কিনা এই ফাংশনটি আপনাকে দেখায়।

function are_arrs_match(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_match(arr1, arr2)) //true
console.log (are_arrs_match(arr1, arr3)) //false

প্রশ্ন আপনাকে বাছাই করতে বলে না, সুতরাং উদাহরণগুলির জন্য যেমন আপনার সমাধানটি ভুল are_arrs_equal([1,2], [2,1])। এছাড়াও, স্ট্রিংফাইজিং কেন অপ্রয়োজনীয়, ভঙ্গুর এবং ভুল তা এই পৃষ্ঠায় অন্যান্য আলোচনা দেখুন।
আপনার মোডগুলি

are_arrs_equal([1,2], [2,1])trueপ্রত্যাশিত হিসাবে প্রত্যাবর্তন সম্ভবত এই সমাধানটি আদর্শ নয়, তবে এটি আমার পক্ষে কাজ করেছে।
Yesnik

অবিকল সমস্যা অর্থাৎ ঐ দুই একটি জন্য শব্দ "সমান" কোনো বিবেকী অর্থে সমান নয় আদেশ ডাটা স্ট্রাকচার। সেগুলি অ্যারে, সেট নয়, এবং যদি আপনি সেট সমতা চান তবে আপনার এটি বলা উচিত - এবং অন্য কোনও প্রশ্নের উত্তর দেওয়া উচিত। :-)
আপনার মোডগুলিকে ভালভাবে আচরণ করুন

1
আমি উপরের মন্তব্যের সাথে একমত, তবে এই সমাধানটি আমার জন্য সহজসংখ্যার সহজ অ্যারেতেও কাজ করে, যেখানে ক্রমটি গুরুত্বপূর্ণ নয়, তাই আমি এটি ব্যবহার করব।
তোমাজাহলিন

1
are_arrs_match([1,2], ["1,2"])(রিটার্ন true) এর জন্য ব্যর্থ এবং নোট করুন যে the sort()কলটি ইনপুট অ্যারেগুলিকে সংশোধন করবে - এটি পছন্দসই নয়।
শেষ পর্যন্ত

5

এটি ২ টি অরসোর্টড অ্যারে তুলনা করে:

function areEqual(a, b) {
  if ( a.length != b.length) {
    return false;
  }
  return a.filter(function(i) {
    return !b.includes(i);
  }).length === 0;  
}

যদিও ব্যয়বহুল (গণনা সংস্থার নিরিখে), এটি একটি শক্তিশালী সমাধান যা বিভিন্ন ধরণের জন্য ভাল হওয়া উচিত এবং এটি বাছাইয়ের উপর নির্ভর করে না!
ব্যবহারকারী3.1415927

4

আমরা এটি কার্যকরী উপায়ে করতে পারি every( https://developer.mozilla.org/en/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / অ্যারে / এভারি )

function compareArrays(array1, array2) {
    if (array1.length === array2.length)
        return array1.every((a, index) => a === array2[index])
    else
        return false
}

// test
var a1 = [1,2,3];
var a2 = [1,2,3];

var a3 = ['a', 'r', 'r', 'a', 'y', '1']
var a4 = ['a', 'r', 'r', 'a', 'y', '2']

console.log(compareArrays(a1,a2)) // true
console.log(compareArrays(a1,a3)) // false
console.log(compareArrays(a3,a4)) // false

4

যখন উভয় অ্যারে একই উপাদান রয়েছে তবে একই ক্রমে নয় তখন আপনার কোডটি কেসটি সঠিকভাবে পরিচালনা করবে না।

আপনার উদাহরণের সাথে আমার কোডটি দেখুন যা দুটি অ্যারের সাথে তুলনা করে যার উপাদান সংখ্যা, আপনি এটি অন্য উপাদান ধরণের (.join () ব্যবহার করে .toString () ব্যবহার করে পরিবর্তিত বা প্রসারিত করতে পারেন।

var a1 = [1,2,3];
var a2 = [1,2,3];
const arraysAreEqual = a1.sort().toString()==a2.sort().toString();
// true if both arrays have same elements else false
console.log(arraysAreEqual);


4

একটি সংখ্যা অ্যারের জন্য চেষ্টা করুন:

a1==''+a2

দ্রষ্টব্য: অ্যারেতেও স্ট্রিং থাকে যখন এই পদ্ধতিটি কাজ করবে না a2 = [1, "2,3"]


3

এখানে আমার সমাধান:

/**
 * Tests two data structures for equality
 * @param {object} x
 * @param {object} y
 * @returns {boolean}
 */
var equal = function(x, y) {
    if (typeof x !== typeof y) return false;
    if (x instanceof Array && y instanceof Array && x.length !== y.length) return false;
    if (typeof x === 'object') {
        for (var p in x) if (x.hasOwnProperty(p)) {
            if (typeof x[p] === 'function' && typeof y[p] === 'function') continue;
            if (x[p] instanceof Array && y[p] instanceof Array && x[p].length !== y[p].length) return false;
            if (typeof x[p] !== typeof y[p]) return false;
            if (typeof x[p] === 'object' && typeof y[p] === 'object') { if (!equal(x[p], y[p])) return false; } else
            if (x[p] !== y[p]) return false;
        }
    } else return x === y;
    return true;
};

যে কোনও নেস্টেড ডেটা স্ট্রাকচারের সাথে কাজ করে এবং স্পষ্টতই অবজেক্টের পদ্ধতিগুলিকে উপেক্ষা করে। এমনকি এই পদ্ধতিটির সাথে অবজেক্ট.প্রোটোটাইপ বাড়ানোর কথা ভাবেন না, যখন আমি একবার চেষ্টা করেছিলাম, jQuery ভেঙে গেছে;)

বেশিরভাগ অ্যারেগুলির জন্য এটি বেশিরভাগ সিরিয়ালাইজেশন সমাধানগুলির চেয়ে দ্রুত। এটি অবজেক্ট রেকর্ডের অ্যারেগুলির জন্য দ্রুততম তুলনা করার পদ্ধতি।


ভাল না! এগুলি সত্য দেয়: equal({}, {a:1})এবং equal({}, null)এই ত্রুটিগুলি আউট:equal({a:2}, null)
ক্রিশ্চিয়ানোম

3
JSON.stringify(collectionNames).includes(JSON.stringify(sourceNames)) ?  array.push(collection[i]) : null

এইভাবে আমি এটি করেছি।


ভাল সমাধান - তবে আমি নির্দিষ্ট পরিস্থিতিতে আশ্চর্য হই যে যদি এটি সর্বদা যেমন কিছু নির্দিষ্ট আদিম বা গভীরভাবে নেস্টেড অ্যারেগুলির সাথে যেমন ইচ্ছা মতো কাজ করে না? আমি আশা করি এটি যদিও সব পরিস্থিতিতে কাজ করে
বেন রোনডাউ

3

2 টি অ্যারে তুলনা করা:

var arr1 = [1,2,3];
var arr2 = [1,2,3];

function compare(arr1,arr2)
{
  if((arr1 == arr2) && (arr1.length == arr2.length))
    return true;
  else
    return false;
}

কলিং ফাংশন

var isBool = compare(arr1.sort().join(),arr2.sort().join());

এই উত্তরটি কার্যকর হবে না, কারণ === অ্যারেগুলির জন্য প্রত্যাশিত আচরণ করে না।
মাইকেল ইয়াং

উত্তরটি কাজ করে, যদিও === এখানে কোনও তাত্পর্য নেই (যেহেতু সাজানো () কেবল অ্যারেতে কাজ করে)। এমনকি == এছাড়াও কাজ করবে।
আমায় কুলকারনী

নিজে চেষ্টা করে দেখুন; আপনি যদি এই কোডটি চালান তবে এটি মিথ্যা প্রিন্ট করে। এটি অ্যারের রেফারেন্স মানগুলিকে তাদের আসল মানগুলির পরিবর্তে == এবং === দ্বারা তুলনা করার কারণে। == এবং === কেবল আদিম ধরণের তুলনা করার উদ্দেশ্যে are
মাইকেল ইয়াং

এটি সত্য প্রত্যাবর্তন করে, আমরা এটি ব্যবহার করেছি, তবে এখনই '===' সরিয়ে ফেলেছি কারণ এটি নেসেসারি নয়
আমায় কুলকার্নি

আহ, আমি খেয়াল করিনি যে আপনি কোনও স্ট্রিংয়ে রূপান্তর করছেন এবং বাছাই এবং যোগদানের পরে ফাংশনটি কল করছেন; আমি ক্ষমাপ্রার্থী.
মাইকেল ইয়াং

3

আমি সাধারণ JSএবং এর সাথে বিশ্বাস করি ECMAScript 2015, যা বোঝার জন্য মধুর এবং সহজ।

var is_arrays_compare_similar = function (array1, array2) {

    let flag = true;

    if (array1.length == array2.length) {

        // check first array1 object is available in array2 index
        array1.every( array_obj => {
            if (flag) {
                if (!array2.includes(array_obj)) {
                    flag = false;
                }
            }
        });

        // then vice versa check array2 object is available in array1 index
        array2.every( array_obj => {
            if (flag) {
                if (!array1.includes(array_obj)) {
                    flag = false;
                }
            }
        });

        return flag;
    } else {
        return false;
    }

}

আশা করি এটি কাউকে সাহায্য করবে


1
তদ্বিপরীত চেক কেন প্রয়োজন? আমরা জানি অ্যারেগুলি একই আকারের, সুতরাং অ্যারে 1 এর প্রতিটি আইটেম যদি অ্যারে 2 তেও পাওয়া যায়; তাহলে আমাদের কেন পরীক্ষা করতে হবে যে অ্যারে 2 এর প্রতিটি আইটেম অ্যারে 1 তে রয়েছে?
জেফরিহাউসার

2

টোম জাটো ধারণা বাড়ানো হচ্ছে। টমাসের অ্যারে.প্রোটোটাইপ ডটকমকে পেরে অ্যারে.প্রোটোটাইপ ডটকম পেয়ারআইডেন্টিকাল বলা উচিত।

এটি এগিয়ে যায়:

[1, 2, [3, 4]].compareIdentical ([1, 2, [3, 2]]) === false;
[1, "2,3"].compareIdentical ([1, 2, 3]) === false;
[1, 2, [3, 4]].compareIdentical ([1, 2, [3, 4]]) === true;
[1, 2, 1, 2].compareIdentical ([1, 2, 1, 2]) === true;

তবে এতে ব্যর্থ হয়:

[[1, 2, [3, 2]],1, 2, [3, 2]].compareIdentical([1, 2, [3, 2],[1, 2, [3, 2]]])

এখানে আরও ভাল (আমার মতে) সংস্করণ:

Array.prototype.compare = function (array) {
    // if the other array is a falsy value, return
    if (!array)
        return false;

    // compare lengths - can save a lot of time
    if (this.length != array.length)
        return false;

    this.sort();
    array.sort();
    for (var i = 0; i < this.length; i++) {
        // Check if we have nested arrays
        if (this[i] instanceof Array && array[i] instanceof Array) {
            // recurse into the nested arrays
            if (!this[i].compare(array[i]))
                return false;
        }
        else if (this[i] != array[i]) {
            // Warning - two different object instances will never be equal: {x:20} != {x:20}
            return false;
        }
    }
    return true;
}

http://jsfiddle.net/igos/bcfCY/


2
-1। আপনি যে উদাহরণটি দিয়েছেন তাতে যদি এটি 'ব্যর্থ হয়' তবে 'ব্যর্থতা' এর কিছুটা নির্বিচার সংজ্ঞা দেওয়ার ক্ষেত্রে এটি কেবলমাত্র ঘটনা। আপনি কেন এই দুটি ভিন্ন অ্যারে সমান বলে বিবেচিত হবেন? আপনি এখানে 'সমতা' কী ধারণাটি বাস্তবায়নের চেষ্টা করছেন তা ব্যাখ্যা করেননি বা কেন এটি একটি বোধগম্য বা সহায়ক, তবে দেখে মনে হচ্ছে আপনি বহুমাত্রিক অ্যারেগুলি এমনভাবে তুলনা করতে চান যেন সেগুলি একক মাত্রিকের সাথে ভেঙে গেছে were বেশী। যদি তা হয় তবে আপনি তাও অর্জন করতে পারেন নি: [1,2] .কম্পার ([[1,2]]) টমসের মতো আপনার সংস্করণটিকেও মিথ্যা দেয়।
মার্ক আমেরিকা

আমি যা অনুমান করতে পারি তার ভিত্তিতে তিনি বলছেন যে [1, 2, 3, 4] এবং [1, 3, 2, 4] সমান হিসাবে তুলনা করা উচিত (অর্ডার ব্যাপার না))
গৌতম বধ্রিনাথন

2
var a1 = [1,2,3,6];
var a2 = [1,2,3,5];

function check(a, b) {
  return (a.length != b.length) ? false : 
  a.every(function(row, index) {
    return a[index] == b[index];
  });
}  

check(a1, a2);

////// বা ///////

var a1 = [1,2,3,6];
var a2 = [1,2,3,6];

function check(a, b) {
  return (a.length != b.length) ? false : 
  !(a.some(function(row, index) {
    return a[index] != b[index];
  }));
}  

check(a1, a2)

আপনি কিছু ফাংশন করতে পারেন যা আমাদের প্রয়োজনীয় শর্তটি যেমন সন্তুষ্ট হয় তবে সম্পূর্ণ পুনরাবৃত্তি হবে না
ভাসান্থ

2

খুব অল্প সংখ্যক কোড সহ আরেকটি পদ্ধতির ( অ্যারে ব্যবহার হ্রাস এবং অ্যারে ব্যবহার করে ):

arr1.length == arr2.length && arr1.reduce((a, b) => a && arr2.includes(b), true)

আপনি যদি অর্ডারটির সাম্যতাও তুলনা করতে চান:

arr1.length == arr2.length && arr1.reduce((a, b, i) => a && arr2[i], true)
  • lengthচেক নিশ্চিত করে যে এক অ্যারের মধ্যে উপাদানের সেট মাত্র অন্যটি একটি উপসেট নয়।

  • রিডিউসারটি একটি অ্যারে দিয়ে হাঁটতে এবং অন্যান্য অ্যারেতে প্রতিটি আইটেম অনুসন্ধান করতে ব্যবহৃত হয়। যদি কোনও আইটেম পাওয়া না যায় তবে হ্রাস ফাংশন রিটার্ন false

    1. প্রথম উদাহরণে এটি পরীক্ষা করা হচ্ছে যে কোনও উপাদান অন্তর্ভুক্ত রয়েছে
    2. দ্বিতীয় উদাহরণটিও আদেশের জন্য পরীক্ষা করুন

1
এই উত্তরটি পরিষ্কার করার জন্য আপনি কি আপনার কোডটি কিছুটা ব্যাখ্যা করতে পারেন?
টেড

1. এক অ্যারে
অন্যটির

২.একটি অ্যারে দিয়ে চলতে এবং অন্য অ্যারেতে প্রতিটি আইটেম সন্ধান করতে রিডিউসার ব্যবহার করুন। যদি কোনও আইটেমটি না পাওয়া যায় তবে হ্রাস ফাংশনটি 'মিথ্যা' দেয়
ডেলস

@ ডিএলস: উত্তরে আপনার ব্যাখ্যা সম্পাদনা করেছেন (কিছুটা পুনরায় বানানো এবং প্রসারিত)। আপনি এখন আপনার মন্তব্যগুলি মুছে ফেলতে এবং প্রথম মন্তব্যটি এবং এটি অপ্রচলিত হিসাবে পতাকাঙ্কিত করতে পারেন।
শেষ পর্যন্ত

2

একটি সহজ পদ্ধতির:

function equals(a, b) {
    if ((a && !b) || (!a && b) || (!a && !b) || (a.length !== b.length)) {
        return false;
    }

    var isDifferent = a.some(function (element, index) { 
        return element !== b[index];
    });

    return !isDifferent;
}

2

ইতিমধ্যে কিছু দুর্দান্ত উত্তর B তবে আমি আন্তের ধারণাটি ভাগ করতে চাই যা অ্যারের তুলনায় নির্ভরযোগ্য বলে প্রমাণিত হয়েছে। আমরা JSON.stringify () ব্যবহার করে দুটি অ্যারের তুলনা করতে পারি । এটি অ্যারের বাইরে একটি স্ট্রিং তৈরি করবে এবং এভাবে সমতার জন্য দুটি অ্যারে থেকে দুটি প্রাপ্ত স্ট্রিংকে তুলনা করবে

JSON.stringify([1,{a:1},2]) == JSON.stringify([1,{a:1},2]) //true

JSON.stringify([1,{a:1},2]) == JSON.stringify([1,{a:2},2]) //false

JSON.stringify([1,{a:1},2]) == JSON.stringify([1,{a:2},[3,4],2]) //false

JSON.stringify([1,{a:1},[3,4],2]) == JSON.stringify([1,{a:2},[3,4],2]) //false

JSON.stringify([1,{a:2},[3,4],2]) == JSON.stringify([1,{a:2},[3,4],2]) //true

JSON.stringify([1,{a:2},[3,4],2]) == JSON.stringify([1,{a:2},[3,4,[5]],2]) //false

JSON.stringify([1,{a:2},[3,4,[4]],2]) == JSON.stringify([1,{a:2},[3,4,[5]],2]) //false

JSON.stringify([1,{a:2},[3,4,[5]],2]) == JSON.stringify([1,{a:2},[3,4,[5]],2]) //true

2

পুনরাবৃত্তি এবং নিস্টেড অ্যারেগুলিতে কাজ করে :

function ArrEQ(a1,a2){
   return( 
        //:Are both elements arrays?
        Array.isArray(a1)&&Array.isArray(a2) 
        ?
        //:Yes: Test each entry for equality:
        a1.every((v,i)=>(ArrEQ(v,a2[i])))
        :
        //:No: Simple Comparison:
        (a1===a2)
   );;
};;

console.log( "Works With Nested Arrays:" );
console.log( ArrEQ( 
    [1,2,3,[4,5,[6,"SAME/IDENTICAL"]]],
    [1,2,3,[4,5,[6,"SAME/IDENTICAL"]]]
));;     
console.log( ArrEQ( 
    [1,2,3,[4,5,[6,"DIFFERENT:APPLES" ]]],
    [1,2,3,[4,5,[6,"DIFFERENT:ORANGES"]]]
));;  

2

NESTED অ্যারেগুলি সহ একাধিক যুক্তি দিয়ে কাজ করে:

//:Return true if all of the arrays equal.
//:Works with nested arrays.
function AllArrEQ(...arrays){
    for(var i = 0; i < (arrays.length-1); i++ ){
        var a1 = arrays[i+0];
        var a2 = arrays[i+1];
        var res =( 
            //:Are both elements arrays?
            Array.isArray(a1)&&Array.isArray(a2) 
            ?
            //:Yes: Compare Each Sub-Array:
            //:v==a1[i]
            a1.every((v,i)=>(AllArrEQ(v,a2[i])))
            :
            //:No: Simple Comparison:
            (a1===a2)
        );;
        if(!res){return false;}
    };;
    return( true );
};;

console.log( AllArrEQ( 
        [1,2,3,[4,5,[6,"ALL_EQUAL"   ]]],
        [1,2,3,[4,5,[6,"ALL_EQUAL"   ]]],
        [1,2,3,[4,5,[6,"ALL_EQUAL"   ]]],
        [1,2,3,[4,5,[6,"ALL_EQUAL"   ]]],
));; 

2
In a simple way uning stringify but at same time thinking in complex arrays:

**Simple arrays**:  
var a = [1,2,3,4];  
var b = [4,2,1,4];  
JSON.stringify(a.sort()) === JSON.stringify(b.sort()) // true  

**Complex arrays**:  
var a = [{id:5,name:'as'},{id:2,name:'bes'}];  
var b = [{id:2,name:'bes'},{id:5,name:'as'}];  
JSON.stringify(a.sort(function(a,b) {return a.id - b.id})) === JSON.stringify(b.sort(function(a,b) {return a.id - b.id})) // true  

**Or we can create a sort function**  

function sortX(a,b) {  
return a.id -b.id; //change for the necessary rules  
}  
JSON.stringify(a.sort(sortX)) === JSON.stringify(b.sort(sortX)) // true  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.