JavaScript හි අරා සංසන්දනය කරන්නේ කෙසේද?


1028

අරා දෙකක් සංසන්දනය කිරීමට මම කැමතියි ... ඉතා මැනවින්, කාර්යක්ෂමව. 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
ඔබට පළමුව ඒවායේ දිග සංසන්දනය කළ හැකි අතර ඒවා එක් එක් අගයන් සමාන නම්.
ටී.ජේ.හුවෙල්

57
අරා දෙකක් ඔබට සමාන වන්නේ කුමක් නිසාද? එකම අංග? මූලද්රව්යවල එකම අනුපිළිවෙල? JSON ලෙස කේතන කිරීම ක්‍රියාත්මක වන්නේ අරාවේ මූලද්‍රව්‍යය JSON වෙත අනුක්‍රමික කළ හැකි තාක් පමණි. අරාවෙහි වස්තු අඩංගු විය හැකි නම්, ඔබ කෙතරම් ගැඹුරට යනු ඇත්ද? වස්තු දෙකක් "සමාන" වන්නේ කවදාද?
ෆීලික්ස් ක්ලින්ග්

52
El ෆීලික්ස්ක්ලිං, “සමානාත්මතාවය” නිර්වචනය කිරීම නියත වශයෙන්ම සියුම් මාතෘකාවකි, නමුත් ඉහළ මට්ටමේ භාෂාවලින් ජාවාස්ක්‍රිප්ට් වෙත පැමිණෙන පුද්ගලයින්ට, මෝඩකම වැනි නිදහසට කරුණක් නැත ([] == []) == false.
ඇලෙක්ස් ඩී

5
Lex ඇලෙක්ස් ඩී, ඔබ බලාපොරොත්තු වන පරිදි අරාව යොමු සමානාත්මතාවය භාවිතා කරයි. ඔබට එය කළ නොහැකි නම් එය ඉතා භයානක වනු ඇත
ජොනීරා

4
Lex ඇලෙක්ස් ඩී මෙය සිදු නොවන භාෂාවක් ගැන මට තරමක් සිතිය නොහැකිය. C ++ හි, ඔබ දර්ශක දෙකක් සංසන්දනය කරනු ඇත - අසත්‍යය. ජාවා හි, ඔබ කරන්නේ ජාවාස්ක්‍රිප්ට් හි මෙන් ය. PHP හි, තිරය පිටුපස යමක් අරා හරහා ලූප වනු ඇත - ඔබ PHP උසස් මට්ටමේ භාෂාවක් ලෙස හඳුන්වනවාද?
ටොමේ සැටෝ - මොනිකා නැවත

Answers:


893

අරා සංසන්දනය කිරීම සඳහා, ඒවා හරහා ලූප කර සෑම අගයක්ම සංසන්දනය කරන්න:

අරා සංසන්දනය කිරීම:

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

කෙසේ වෙතත්, මෙය JSON දත්ත වැනි සංසන්දනය කිරීම සඳහා සේවය කිරීම බව මතක තබා ගන්න, පන්ති අවස්ථා සහ වෙනත් දේවල් නොවේ. ඔබට සංකීර්ණ වස්තූන් සංසන්දනය කිරීමට අවශ්‍ය නම්, මෙම පිළිතුර දෙස බලන්න . ඔබ
සමඟ මෙම කාර්යය 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
Nt පමණක් මෙය කළ හැකි නිවැරදි ක්‍රමයයි, එය සැලකිය යුතු තරම් කාර්යක්ෂම වේ. මෙන්න මෙම ප්‍රශ්නයේ යෝජනා කර ඇති සියලුම ක්‍රම සඳහා මම සකස් කළ ඉක්මන් jsperf පිටපතක්. jsperf.com/comparing-arrays2
ටොල්ගා ඊ

100
සාදන ලද වර්ගයේ මූලාකෘතියක් වෙනස් කිරීම නියත වශයෙන්ම නිවැරදි මාර්ගය නොවේ
ජැස්පර්

33
ඊට අමතරව, එය නැවත ලිවීම පහසු ද යන්න ගැන නොවේ, පිළිතුරක් නරක පුරුද්දක් ලෙස සලකන දෙයක් නිර්දේශ නොකළ යුතුය ( developper.mozilla.org/en-US/docs/Web/JavaScript/Guide/… ) "නිවැරදි මාර්ගය" යන ශීර්ෂයට පහළින් නියත වශයෙන්ම මෙය නොකරන්න
ජැස්පර්

397

මෙය ක්‍රියාත්මක වන්නේ පරිමාණ අරා සඳහා පමණි (පහත සටහන බලන්න), එය කෙටි ය:

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

ඊතල කාර්යයන් සහිත ECMAScript 6 / CoffeeScript / TypeScript හි Rr:

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

(සටහන: මෙහි 'පරිමාණය' යන්නෙන් අදහස් කරන්නේ කෙලින්ම භාවිතා කළ හැකි අගයන්ය ===. එබැවින්: සංඛ්‍යා, නූල්, වස්තු යොමු කිරීම, ශ්‍රිතය යොමු කිරීම.

යාවත්කාලීන කරන්න

අදහස් වලින් මා කියවූ දෙයින්, අරාව වර්ග කිරීම හා සංසන්දනය කිරීම නිවැරදි ප්‍රති result ල ලබා දිය හැකිය:

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
මම මේකට කැමතියි, පා readers කයන් දැන සිටිය යුතු වුවත් මෙය ක්‍රියාත්මක වන්නේ වර්ග කළ අරා මත පමණි.
එලන් ස්පර්ටස්

14
එය වර්ගීකරණය කළ හෝ නොකළ ඕනෑම ආකාරයක අරා මත ක්‍රියා කරයි
මයිකල් මිස්ක්සිසින්

36
ඔව්, හරියටම. මෙම ශ්‍රිතය අරා දෙකක් සංසන්දනය කළ යුතුය, ඒවා වර්ග කර තිබේද නැද්ද යන්න ගැටළුවක් නොවේ, ඒවායේ අඛණ්ඩ මූලද්‍රව්‍ය සමාන විය යුතුය.
මයිකල් මිස්ක්සිසින්

22
@espertus ඇත්ත වශයෙන්ම, අරා දෙකෙහිම මූලද්‍රව්‍යයන්ට එකම අනුපිළිවෙලක් නොමැති නම් එය සත්‍ය නොවේ. කෙසේ වෙතත්, සමානාත්මතා පරීක්‍ෂණයක පරමාර්ථය වන්නේ ඒවා එකම මූලද්‍රව්‍යයන් අඩංගු දැයි පරීක්ෂා කිරීම නොව එකම අනුපිළිවෙලෙහි එකම මූලද්‍රව්‍යය තිබේදැයි පරීක්ෂා කිරීමයි.
ක්වෙන්ටින් රෝයි

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];අපේක්ෂිත පරිදි ක්‍රියා නොකරනු ඇත)
mems

221

අරා / වස්තු බර කේතීකරණ ව්‍යාපෘති සඳහා අන්ඩර්ස්කෝර් පුස්තකාලය භාවිතා කිරීමට මම කැමතියි ... අන්ඩර්ස්කෝර් සහ ලොඩාෂ් හි ඔබ අරා හෝ වස්තු සංසන්දනය කළත් එය මේ ආකාරයට පෙනේ:

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

23
ඇණවුම වැදගත් බව සලකන්න _.isEqual([1,2,3], [2,1,3]) => false
Vitaliy Alekask

3
නැතහොත් ඔබට isEqualක්‍රියාකාරීත්වය පමණක් අවශ්‍ය නම් , ඔබට සැමවිටම lodash.isequal මොඩියුලය භාවිතා කළ හැකිය
hellatan

6
ඔබට සමහර විට _.difference () භාවිතා කළ හැකිය; ඇණවුම ඔබට වැදගත් නොවේ නම්
රොනාන් ක්විල්වෙවර්

5
ඇණවුම වැදගත් නොවන්නේ නම් අපට මෙම පරීක්‍ෂණයට පෙර අරාව වර්ග කළ හැකිය_.isEqual([1,2,3].sort(), [2,1,3].sort()) => true
ෆිලිප්

වඩාත් සංක්ෂිප්ත හා answer ජු පිළිතුර IMHO :-)
කීරාන් රයන්

127

මෙය JSON stringify භාවිතයෙන් කළ හැකි සරලම ක්‍රමය යැයි මම සිතමි, සමහර අවස්ථාවල එය හොඳම විසඳුම විය හැකිය:

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

මෙය වස්තූන් a1හා a2නූල් බවට පරිවර්තනය කරන බැවින් ඒවා සංසන්දනය කළ හැකිය. බොහෝ අවස්ථාවන්හිදී ඇණවුම වැදගත් වේ, මක්නිසාද යත්, ඉහත එක් පිළිතුරක පෙන්වා ඇති වර්ග කිරීමේ ඇල්ගොරිතමයක් භාවිතා කර වස්තුව වර්ග කළ හැකි බැවිනි.

ඔබ තවදුරටත් වස්තුව සංසන්දනය නොකරන බව මතක තබා ගන්න. එය ඔබට අවශ්‍ය දේ හරියටම නොවිය හැකිය.


හොඳ පිළිතුරක් නමුත් [] == [] වැරදි ලෙස ආපසු එන්නේ ඇයි? දෙකම සරල වස්තු නම් ඇයි?
පර්දීප් ජේන්

4
ArdPardeepJain, මෙයට හේතුව පෙරනිමියෙන්, වස්තු සඳහා වන ECMAScript හි සමානාත්මතා ක්‍රියාකරු එකම මතක ස්ථානය සඳහන් කරන විට සත්‍ය වේ. Var x = y = [] උත්සාහ කරන්න; // දැන් සමානාත්මතාවය සැබෑ වේ.
radtek

7
JSON stringify ශ්‍රිතය ඉක්මන් නොවන බව සැලකිල්ලට ගැනීම. විශාල අරා සමඟ භාවිතා කිරීම අනිවාර්යයෙන්ම ප්‍රමාදය හඳුන්වා දෙනු ඇත.
ලූකස් ලයිසිස්

7
JSON.stringify භාවිතා කිරීමට වඩා හොඳ / වේගවත් ක්‍රමයක් තිබේද යන්න ප්‍රශ්නය විශේෂයෙන් අසයි .
දොන් හැච්

සමහර අවස්ථාවන්ට මෙය හොඳ විසඳුමක් විය හැක්කේ මන්ද යන්න පිළිබඳව එය වඩාත් සවිස්තරාත්මක වේ.
රැඩ්ටෙක්

62

ප්‍රායෝගික මාර්ගය

"වැරදි" විසඳුමකට වඩා වෙනස්ව "නිවැරදි මාර්ගය" ("නිවැරදි") නම් විශේෂිත ක්‍රියාත්මක කිරීමක් "නිවැරදි මාර්ගය" යැයි පැවසීම වැරදියි කියා මම සිතමි. ටොමේගේ විසඳුම නූල් මත පදනම් වූ අරාව සංසන්දනය කිරීමට වඩා පැහැදිලි දියුණුවක් වන නමුත් එයින් අදහස් කරන්නේ එය වෛෂයිකව “හරි” යන්නයි. කුමක්ද නිවැරදි කෙසේ හෝ? එය වේගවත්මද? එය වඩාත් නම්‍යශීලීද? තේරුම් ගැනීම පහසුම ද? නිදොස් කිරීම ඉක්මන් ද? එය අවම මෙහෙයුම් භාවිතා කරයිද? එහි අතුරු ආබාධ තිබේද? කිසිම විසඳුමකට සෑම දෙයකින්ම හොඳම දේ තිබිය නොහැකිය.

ටොමේට ඔහුගේ විසඳුම වේගවත් යැයි පැවසිය හැකි නමුත් එය අනවශ්‍ය ලෙස සංකීර්ණ යැයි මම කියමි. එය සියලු අරා සඳහා වැඩ කරන, කූඩු කළ හෝ නොවූ සියලු දෙනාටම විසඳුමක් වීමට උත්සාහ කරයි. ඇත්ත වශයෙන්ම, එය අරා වලට වඩා වැඩි ප්‍රමාණයක් ආදානයක් ලෙස පිළිගන්නා අතර තවමත් "වලංගු" පිළිතුරක් දීමට උත්සාහ කරයි.


ජනක විද්‍යාව නැවත භාවිතා කිරීමේ හැකියාව ලබා දෙයි

මගේ පිළිතුර වෙනස් ආකාරයකින් ගැටලුවට එළඹෙනු ඇත. 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'result ලය වනුයේ 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පරිශීලක-සදහන් comparator (කිරීමට 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කුඩා ක්‍රියා පටිපාටිවලට දිරාපත් වීම කෙරෙහි වැඩි අවධානයක් යොමු කරන ලදී . එය සිත්ගන්නාසුලු ව්‍යායාමයකි, නමුත් ඇත්ත වශයෙන්ම මෙම ගැටලුවට එළඹිය හැකි හොඳම (වඩාත්ම ප්‍රායෝගික) ක්‍රමය නොවේ. ඔබ කැමති නම්, ඔබට මෙම සංශෝධන ඉතිහාසය දැක ගත හැකිය.


9
"හොඳම ආකාරයේ කේතයට අදහස් දැක්වීම් පවා අවශ්‍ය නොවේ" ... එය පැවසීමට වෛර කරන්න, නමුත් මෙම කේතයට වැඩි අදහස් දැක්වීමක් සහ / හෝ වෙනත් නමක් භාවිතා කළ හැකිය - "සංසන්දනය කරන්න" තරමක් අපැහැදිලි ය. මම නිවැරදිව කියවනවා නම්, ඔබේ “සංසන්දනය” අත්‍යවශ්‍යයෙන්ම ව්‍යංජන පුනරාවර්තන “සෑම එකක්ම” වේ. මම සිතනවා. නැතහොත් එය ව්‍යංජන පුනරාවර්තන “සමහරක්” ද? හ්ම්. මේ සඳහා අවශ්‍ය ප්‍රමාණයට වඩා සිතීම අවශ්‍ය වේ. සමහර විට වඩා හොඳ නමක් "අරාස්එක්විවන්ට්" විය හැකි අතර එය "සමානතා සම්බන්ධතාවයේ" සම්මත පාරිභාෂිතය උත්තේජනය කරයි. නැතහොත්, වඩාත් පැහැදිලිව (කෙසේ වෙතත් මට), "පුනරාවර්තන අවශ්‍යතාව".
දොන් හැච්

1
පිළිතුරු දීමට අවස්ථාව ලබා දීම ගැන ඩොන් හැච්ට ස්තූතියි. "සංසන්දනය" කිරීමෙන් ඔබ අදහස් කරන්නේ arrayCompare? ඔව් ශ්‍රිතය ව්‍යංජන වේ, නමුත් එය වෙනස් වන්නේ someසහ every. arrayCompareසංසන්දනය කිරීම සඳහා සංසන්දකයෙකු සහ අරා දෙකක් ගනී . ඕනෑම අත්තනෝමතික ශ්‍රිතයක් භාවිතා කර අරා සංසන්දනය කළ හැකි නිසා මම විශේෂයෙන් සාමාන්‍ය නමක් තෝරා ගතිමි. ශ්‍රිතය ව්‍යංජන කර ඇති බැවින් නව අරාව සංසන්දනය කිරීමේ කාර්යයන් නිර්මාණය කිරීම සඳහා එය විශේෂීකරණය කළ හැකිය (උදා. arrayEqual). ඔබට වඩා හොඳ නමක් යෝජනා කළ හැකිද? අමතර අදහස් හෝ පැහැදිලි කිරීමක් අවශ්‍ය යැයි ඔබට හැඟෙන ක්ෂේත්‍ර මොනවාද? ^ _ ^ ගැන සාකච්ඡා කිරීමට ලැබීම ගැන මම සතුටු වෙමි
ස්තූතියි

1
මගේ කාරණය තවමත් පැහැදිලි දැයි නිශ්චිත නැත - නමුත් මගේ කාරණය නම්, ඔබේ ශ්‍රිතය සැබවින්ම අත්තනෝමතික ශ්‍රිතයක් ගැනීමට අදහස් නොකෙරේ , මම නොසිතමි - එය සමාන සම්බන්ධතාවයක් ගැනීමට අදහස් කරන අතර එය සමානතා සම්බන්ධතාවයක් ලබා දෙයි. එය වැදගත් ය - මා සඳහන් කළ ආකාරයට, වෙනත් අය අත්තනෝමතික ද්විමය ක්‍රියාකාරිත්වයක් ලබා දෙන්නේ නම්, මිනිසුන් බොහෝ විට "සංසන්දනය කරන්න" යනුවෙන් හැඳින්වුවද, එය සංවේදී කිසිවක් නොකරනු ඇත (මම නොසිතමි). එබැවින් "සංසන්දනය" වෙනුවට "සමාන" නමට තැබීම ප්‍රයෝජනවත් වනු ඇතැයි මම සිතමි.
දොන් හැච්

1
ortor, කතෘ: සුපිරි ප්‍රයෝජනවත් පිළිතුර, හොඳ වැඩ, +1. ප්‍රතිපෝෂණය: ඔබ සරල බව වෙනුවෙන් පෙනී සිටියත්, එක් පේළියක ඊතල තුනක් සහිත ප්‍රකාශනයක් සරල හෝ බොහෝ සංවර්ධකයින්ට තේරුම් ගැනීමට පහසු නැත. උදා: f => ([x, ... xs]) => ([y, ... ys]) =>. මම නිරන්තරයෙන් මෙය භාවිතා කරන අතර තවමත් "එය දෙස බලන්න" වෙනුවට මානසිකව දිරාපත් වීමට සිදුවිය. දෙවන කරුණ ftor හරි, සෑම දෙයක්ම භාවිතා කරන්න. ඔබේ හේතු කිරා බැලීමේදී පවා, සමබරතාවයෙන් එය මට පමණක් නොව, ඔබේ නිර්මාණ දර්ශනය අනුමාන කිරීමට උත්සාහ කරන විට ඔබේ දෘෂ්ටිකෝණයෙන් ද හොඳ බව පෙනේ.
විට්නිලන්ඩ්

1
මෙය ඉගෙනීම සඳහා ස්ථානයක් බව මට වැටහී ඇත, නමුත් මම මෙහි උපකල්පනය කරන්නේ ක්‍රියාකාරී ශෛලිය හැදෑරූ සාමාන්‍ය ක්‍රමලේඛකයෙකුට ඕනෑම ව්‍යංජන ශ්‍රිතයක් නොකැඩූ එකක් බවට පරිවර්තනය කළ හැකි බවයි. මගේ පිළිතුර මේ බව යෝජනාවක් නැත ශෛලිය ඔබේ ම එබුම නීති භාවිතා කර ලියන්න, එය uncurried ලිවීම්, එය ලිවීමට කෙසේ වෙතත් ඔබ අවශ්ය - - ඔබේ ම වැඩ සටහනේ දී භාවිතා කිරීමට අදහස් කරන්නේ මම ශෛලිය මගේ පිළිතුරු ලියන්න මම හී විශ්වාස කරන වැඩසටහන හොඳම. අපගේ වැඩසටහන් කෘතිමව ප්‍රකාශ කරන ආකාරයට අභියෝග කිරීමට අන් අයට ආරාධනා කිරීමට මම කැමතියි
ස්තූතියි

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

@ASDF: “සමාන” යන්නෙන් අදහස් කරන්නේ කුමක්ද යන්න ප්‍රශ්නයෙන් පැහැදිලි නැත. නිසැකවම මෙම පිළිතුර නොගැඹුරු පරීක්‍ෂණයක් කරයි. මම සටහනක් එකතු කරන්නම්.
ටිම් ඩවුන්

මෙය අරා සඳහා අසමත් වේ ([1, 2, [3, 2]], [1, 2, [3, 2]]);
ගෝපිනාත් ශිව

4
Op ගෝපිනාත්ෂිවා: හොඳයි, එය අසාර්ථක වන්නේ ඔබ එය නැවත පැමිණෙනු ඇතැයි අපේක්ෂා කරන්නේ නම් පමණි true. පිළිතුර පැහැදිලි කරන්නේ එය එසේ නොවන බවයි. ඔබට කැදැලි අරා සංසන්දනය කිරීමට අවශ්‍ය නම්, ඔබට පහසුවෙන් පුනරාවර්තන චෙක්පතක් එක් කළ හැකිය.
ටිම් ඩවුන්

57

මුල් ප්‍රශ්නයේ ආත්මය තුළ:

අරා දෙකක් සංසන්දනය කිරීමට මම කැමතියි ... ඉතා මැනවින්, කාර්යක්ෂමව . මන ancy කල්පිත කිසිවක් නැත , ඒවා සමාන නම් සත්‍යය, එසේ නොවේ නම් අසත්‍යය.

පහත ප්‍රති results ල සමඟ මෙහි යෝජනා කර ඇති වඩාත් සරල යෝජනා කිහිපයක් මත මම කාර්ය සාධන පරීක්ෂණ පවත්වමි (වේගයෙන් මන්දගාමී):

අතර (67%) , ටිම් ඩවුන් විසින්

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

සෑම (69%) පරිශීලක 2782196

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

අඩු (74%) DEIs විසින්

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

join & toString (78%) විසින් ගයිස්කා ඇලෙන්ඩේ සහ විවේක් විසිනි

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

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

අඩක් ස්ට්‍රිං (90%) වික්ටර් පැලෝමෝ විසිනි

a1 == a2.toString();

stringify (100%) radtek විසින්

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

සටහන පහත උදාහරණ පෙලගැස්මක් හිඳගෙන,, තනි-මාන අයාත උපකල්පනය කරයි. .lengthපොදු මිණුම් ලකුණක් සඳහා සංසන්දනය ඉවත් කර ඇත ( a1.length === a2.lengthඕනෑම යෝජනාවකට එකතු කරන්න, එවිට ඔබට ~ 10% කාර්ය සාධනය ඉහළ නංවනු ඇත). එක් එක් වේගය සහ සීමාව දැන ගැනීම සඳහා ඔබට වඩාත් සුදුසු විසඳුම් තෝරන්න.

සම්බන්ධයක් නැති සටහන: මෙම ප්‍රශ්නයට පරිපූර්ණ නීත්‍යානුකූල පිළිතුරු මත පහළ ඡන්ද බොත්තම මත සියලු දෙනාටම ප්‍රීතිමත් ජෝන් වේන්ස් ලැබීම ජනතාව සිත්ගන්නා කරුණකි .


සබැඳිය හිස් පරීක්ෂණයක් විවෘත කරයි.
ඇලෙක්සැන්ඩර් අබකුමොව්

ඔබ අරාවෙහි විශාලත්වය වැඩි කරන්නේ නම්, මෙම සංඛ්‍යා අදාළ නොවේ (විශේෂයෙන් අඩු කිරීමේ ප්‍රවේශය). : 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] ) ]

අරාවෙහි ව්‍යුහය කෙබඳු වනු ඇත්ද යන ප්‍රශ්නයේ සඳහන් නොවේ, එබැවින් ඔබ තුළ කූඩුවල අරා හෝ වස්තූන් නොමැති බව ඔබ නිසැකවම දන්නේ නම් (එය මට සිදු විය, ඒ නිසා මම මේ වෙත පැමිණියේ පිළිතුර) ඉහත කේතය ක්‍රියාත්මක වේ.

සිදුවන්නේ අරා දෙකම සංයුක්ත කිරීම සඳහා අපි පැතිරුම් ක්‍රියාකරු (...) භාවිතා කිරීමයි, ඉන්පසු ඕනෑම අනුපිටපත් ඉවත් කිරීමට අපි සෙට් භාවිතා කරමු. ඔබට ඒවායේ ප්‍රමාණයන් සැසඳිය හැකි බව දැනගත් පසු, අරා තුනම එකම ප්‍රමාණයක් තිබේ නම් ඔබට යාමට හොඳය.

මෙම පිළිතුර මූලද්‍රව්‍ය අනුපිළිවෙල නොසලකා හරියි , මා පැවසූ පරිදි, මට හරියටම තත්වය සිදුවිය, එබැවින් සමහර විට එකම තත්වයේ සිටින අයෙකු මෙහි පැමිණිය හැකිය (මා කළ පරිදි).


සංස්කරණය 1.

දිමිත්‍රි ග්‍රින්කෝගේ ප්‍රශ්නයට පිළිතුරු දෙමින්: "ඔබ මෙහි පැතිරුම් ක්‍රියාකරු (...) භාවිතා කළේ ඇයි - ... නව කට්ටලයක්? එය ක්‍රියා නොකරයි"

මෙම කේතය සලකා බලන්න:

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/Reference/Global_Objects/Set බලන්න ). අනෙක් අතට, ඔබ මෙම කේතය භාවිතා කරන විට:

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

ඔබට ලැබෙනු ඇත

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

වෙනස එයයි, කලින් මට සෙට් එකක් ලබා දෙනු ඇත, එය මට එම කට්ටලයේ ප්‍රමාණය ලබා ගත හැකි තරමට වැඩ කරනු ඇත, නමුත් දෙවැන්න මට අවශ්‍ය අරාව ලබා දෙයි, යෝජනාවට වඩා සෘජු වන්නේ කුමක්ද.


ඔබ මෙහි පැතිරුම් ක්‍රියාකරු (...) භාවිතා කළේ ඇයි - ... නව කට්ටලයක්? එය ක්‍රියා නොකරයි.
දිමිත්‍රි ග්‍රින්කෝ

දිමිත්‍රි ග්‍රින්කෝ මගේ සංස්කරණ 1 හි ඔබගේ ප්‍රශ්නයට පිළිතුරු දුන් බව මම විශ්වාස කරමි. නමුත් පිළිතුරු දෙකම ඔබට මඟ පෙන්විය හැකි බැවින්, 'එය ක්‍රියා නොකරයි' යැයි පැවසීමෙන් ඔබ අදහස් කළේ කුමක්දැයි මට විශ්වාස නැත
ජෙෆර්සන් යුක්ලයිඩ්ස්

10

JSON.encode හි ඇති ආකාරයටම join () භාවිතා කළ යුතුය.

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
JSON උත්පාදනය කිරීම ද ලූප වේ, ඔබ (හෝ එසේ පෙනේ) ඒ ගැන දන්නේ නැත. ලූප් කිරීමට අමතරව, JSON උත්පාදනය කිරීමට වැඩි මතකයක් අවශ්‍ය වේ - එය සංසන්දනය කිරීමට පෙර එම අරා වල නූල් නිරූපණයන් 2 ක් නිර්මාණය කරයි. පහල ශ්‍රිතය ක්‍රියාත්මක වන්නේ හොඳම සිට නරකම දක්වා පිළිතුරු ඇණවුම් කිරීම සඳහා ය. මම හිතන්නේ ඔබේ පිළිතුර හොඳ පිළිතුරක් නොවන නිසා මම එය පහත් කළා.
ටොමේ සැටෝ - මොනිකා

2
කණගාටුයි, මම කිව්වේ JSON වෙනුවට .join(). සමහර විට ඔබ ඔබේ දෙවන විසඳුම ප්‍රාථමික ලෙස ප්‍රකාශ කළේ නම් (එය වඩා හොඳ එකක් බැවින්, බහුමානීය අරා වලට එරෙහිව දත් රහිත වුවද), මම ඔබව එසේ විනිශ්චය නොකරමි. මෙතෙක්, අරා නූල් බවට පරිවර්තනය කරන සියලුම පිළිතුරු මම පහත දැක්වුවෙමි. ඔබට දැන ගැනීමට අවශ්‍ය නම්, නිවැරදි මාර්ගය භාවිතා කරන සියල්ලම මම ඉහළට ඔසවා තැබුවෙමි. මෙයින් අදහස් කරන්නේ im ටිම් ඩවුන්ගේ පිළිතුර සහ බයිරිස්.
ටොමේ සැටෝ - මොනිකා

6
පළමු අනුවාදය අසාර්ථකයි:, checkArrays([1,2,3] , ["1,2",3]) == trueඔබට එය සිදුවීමට අවශ්‍ය යැයි සිතිය නොහැකිය.
ඩොයින්

2
@epascarello: ඔව්, ඔබට හැකි නමුත් (ඔබ යෝජනා කරන ඉතා දිගු බෙදුම්කරුගේ අකාර්යක්ෂමතාව පසෙක තබා) එයින් අදහස් වන්නේ චෙක්ආරේස් () ක්‍රියාකාරීත්වය වැරදි ලෙස හැසිරෙන විට එජ් අවස්ථා (අරාවෙහි ඔබේ බෙදුම්කරු සමඟ නූලක් අඩංගු වන විට) ඇති බවයි. . අරා වල අන්තර්ගතය ගැන ඔබ යමක් දන්නේ නම් මෙය ගැටළුවක් නොවනු ඇත (එබැවින් ඔබට අරාව අයිතමවල නොමැති බව ඔබට විශ්වාසයි බෙදුම්කරුවෙකු තෝරා ගත හැකිය), නමුත් ඔබ සාමාන්‍ය අරාව-සංසන්දනයක් ලිවීමට උත්සාහ කරන්නේ නම් ශ්‍රිතය, එවිට මේ ආකාරයට භාවිතා කිරීමෙන් join()එය සියුම්ව දෝෂ සහිත වේ!
ඩොයින්

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

ඔබ චායි ප්‍රකාශන පුස්තකාලය සමඟ මෝචා වැනි පරීක්ෂණ රාමුවක් භාවිතා කරන්නේ නම් , අරා සංසන්දනය කිරීමට ඔබට ගැඹුරු සමානාත්මතාවය භාවිතා කළ හැකිය .

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

const array1 = [1]; const array2 = [1, 1]; console.log (array1.join ('') === array2.join ('')) // නැවත සත්‍ය වේ
ඩෑන් එම්.

එය නොකළ යුතුය: array1.join ('') '1' සහ array2.join ('') '11'
ගයිස්කා ඇලෙන්ඩේ

සමාවෙන්න, යතුරු ලියනය. පළමු අරාව විය යුතුය [11]. මෙය සිදුවන්නේ ඇයි සහ නිවැරදි කරන්නේ කෙසේද යන්න ඉතා පැහැදිලිය.
ඩෑන් එම්

ඔබ ගැන කුමක් දැයි විශ්වාස නැත, එය ඉතා සරල ය: [1] .ජොයින් () "1" සහ [1,1] .ජොයින් () "1,1", එබැවින් ඔවුන් කිසි විටෙකත් සමාන නොවනු ඇත
ගයිස්කා ඇලෙන්ඩේ

කරුණාකර, මගේ අදහස නැවත වඩාත් ප්‍රවේශමෙන් කියවන්න. ඔබට තවමත් එය නොපෙනේ නම්, කරුණාකර ideone.com/KFu427
ඩෑන් එම්.

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අපේක්ෂිත පරිදි ප්‍රතිලාභ . සමහර විට මෙම විසඳුම පරිපූර්ණ නොවේ, නමුත් එය මට සාර්ථක විය.
ඔව්නික්

ඇණවුම් කරන ලද දත්ත ව්‍යුහයක් සඳහා “සමාන” යන වචනයේ කිසිදු අර්ථයකින් එම දෙක සමාන නොවේ . ඒවා අරා, කට්ටල නොවේ, ඔබට සමානාත්මතාවය සැකසීමට අවශ්‍ය නම් ඔබ එය හැඳින්විය යුතුය - සහ වෙනත් ප්‍රශ්නයකට පිළිතුරු දෙන්න. :-)
ඔබේ මෝඩයන්ට හොඳින් සලකන්න

1
ඉහත අදහස් සමඟ මම එකඟ වෙමි, නමුත් මෙම විසඳුම මගේ සරල සංඛ්‍යා අරා තුළ ද ක්‍රියා කරයි, එහිදී ඇණවුම වැදගත් නොවේ, එබැවින් මම එය භාවිතා කරමි.
tomazahlin

1
are_arrs_match([1,2], ["1,2"])(ප්‍රතිලාභ true) සඳහා අසමත් වේ . the sort()ඇමතුම මඟින් ආදාන අරා වෙනස් කරන බව සලකන්න - මෙය සුදුසු නොවනු ඇත.
try-

5

මෙය වර්ග නොකළ අරා 2 ක් සංසන්දනය කරයි:

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

මිල අධික වුවද (ගණනය කළ සම්පත් අනුව), මෙය විවිධ වර්ග සඳහා හොඳ විය යුතු ශක්තිමත් විසඳුමක් වන අතර වර්ග කිරීම මත රඳා නොපවතී!
user3.1415927

5

අරා දෙකෙහිම එකම මූලද්‍රව්‍ය ඇති නමුත් එකම අනුපිළිවෙලට නොමැති විට ඔබේ කේතය නඩුව නිසි ලෙස හසුරුවන්නේ නැත.

මූලද්‍රව්‍ය සංඛ්‍යා වන අරා දෙකක් සංසන්දනය කරන ඔබේ උදාහරණය සමඟ මගේ කේතය දෙස බලන්න, ඔබට එය වෙනත් මූලද්‍රව්‍ය වර්ග සඳහා වෙනස් කිරීමට හෝ දිගු කිරීමට හැකිය. (.ToString () වෙනුවට .join () භාවිතා කිරීමෙන්.

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


5

සංඛ්‍යා සමූහයක් සඳහා උත්සාහ කරන්න:

a1==''+a2

සටහන: අරාවෙහි ද නූල් අඩංගු වන විට මෙම ක්‍රමය ක්‍රියා නොකරනු ඇත, උදා a2 = [1, "2,3"].


4

every( Https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/every ) භාවිතා කරමින් අපට මෙය ක්‍රියාකාරී ආකාරයෙන් කළ හැකිය.

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

විශාල දත්ත කට්ටල සමඟ කටයුතු කිරීමේදී JSON.stringfy මන්දගාමී බව මම දනිමි, නමුත් ඔබ අච්චු වචන භාවිතා කරන්නේ නම් කුමක් කළ යුතුද?

උදාහරණයක්:

const a = [1, 2, 3];
const b = [1, 2, 'test'];

const a_string = Array.isArray(a) && `${a}`;
const b_string = Array.isArray(b) && `${b}`;

const result = (a === b);

console.log(result);

ඔබ ඇත්ත වශයෙන්ම ES6 භාවිතා කරන බව සැලකිල්ලට ගනිමින්.

=)


පරෙස්සම් වන්න, මෙම සංසන්දනය නූලකට සාපේක්ෂව අරාවකට වැඩ කරනු ඇත.
එලියාස් ඩෝර්නල්ස්

Li එලියාස් ඩෝර්නල්ස්, ස්තූතියි පොකුරක්! විචල්යය අච්චු වචනාර්ථයකට පැවරීමට පෙර චෙක්පතක් කිරීම සඳහා මම මගේ පිළිතුර යාවත්කාලීන කළෙමි.
සුදු හාවා

Hehe, දැන් එය එක හා සමාන මේ දෙක කියනු ඇත a = ["1,1", "2"]හා b = [1,1,2](හෝ b = ["1", "1,2"]) ... මම එය මෙම ප්රවේශය සමඟ ශක්තිමත් දෙයක් ලබා ගැනීමට අපහසු වෙයි කියලා. ^^
එලියාස් ඩෝර්නල්ස්

ජාවාස්ක්‍රිප්ට් යනු ලිහිල් ලෙස ටයිප් කළ භාෂාවකි :). ඉතින් මගේ මතය අනුව, එය එසේ නම් මම යතුරු ලියනය හෝ ප්‍රවාහය වැනි දෙයක් තෝරා ගනිමි . XD
සුදු හාවා

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

ඕනෑම කැදැලි දත්ත ව්‍යුහයක් සමඟ ක්‍රියා කරන අතර පැහැදිලිවම වස්තූන්ගේ ක්‍රම නොසලකා හරියි. මෙම ක්‍රමය සමඟ Object.prototype දිගු කිරීම ගැන සිතන්නවත් එපා, මම මෙය වරක් උත්සාහ කළ විට jQuery කැඩී ගියේය;)

බොහෝ අරා සඳහා එය බොහෝ අනුක්‍රමික විසඳුම් වලට වඩා වේගවත් ය. වස්තු වාර්තා වල අරා සඳහා වේගවත්ම සංසන්දනය කිරීමේ ක්‍රමය එය විය හැකිය.


හොඳ නැත! මේවා සත්‍ය වේ: equal({}, {a:1})සහ equal({}, null)මෙම දෝෂ ඉවත් වේ:equal({a:2}, null)
kristianlm

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());

=== අරා සඳහා අපේක්ෂිත පරිදි ක්‍රියා නොකරන බැවින් මෙම පිළිතුර ක්‍රියා නොකරනු ඇත.
මයිකල් යැං

=== මෙහි කිසිදු වැදගත්කමක් නොතිබුණද පිළිතුර ක්‍රියාත්මක වේ (වර්ග කිරීම () අරාව මත පමණක් ක්‍රියාත්මක වන බැවින්). == පවා වැඩ කරයි.
අමායි කුල්කර්නි

එය ඔබම අත්හදා බලන්න; ඔබ මෙම කේතය ක්‍රියාත්මක කරන්නේ නම් එය ව්‍යාජ ලෙස මුද්‍රණය වේ. මෙයට හේතුව අරා වල විමර්ශන අගයන් ඒවායේ සත්‍ය අගයන් වෙනුවට == සහ === යන දෙකෙන්ම සංසන්දනය කිරීමයි. == සහ === අදහස් කරන්නේ ප්‍රාථමික වර්ග සංසන්දනය සඳහා පමණි.
මයිකල් යැං

එය සත්‍යයක් බවට පත්වේ, අපි එය භාවිතා කර ඇත, නමුත් මම දැන් '===' ඉවත් කර ඇත්තේ එය අත්‍යවශ්‍ය නොවන නිසාය
කුල්කර්නි

අහ්, ඔබ නූලක් බවට පරිවර්තනය වී ශ්‍රිතය වර්ග කිරීම හා සම්බන්ධ වීමෙන් පසුව ඇමතීම මා දුටුවේ නැත; මම සමාව ඉල්ලනවා.
මයිකල් යැං

3

දැනටමත් හොඳ පිළිතුරු කිහිපයක් ඇත.නමුත් අරා සංසන්දනය කිරීමේදී විශ්වාසදායක බව ඔප්පු කර ඇති පරණ අදහස බෙදා ගැනීමට මම කැමතියි. අපට 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

3
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  

2

ටොමේ සැටෝ අදහස දීර් ing කිරීම. ටොමාස්ගේ Array.prototype.compare, Array.prototype.compareIdentical ලෙස හැඳින්විය යුතුය.

එය ඉදිරියට යයි:

[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. ඔබ ලබා දුන් ආදර්ශය මත එය 'අසමත්' නම්, එය එසේ වන්නේ 'අසමත් වීම' පිළිබඳ තරමක් අත්තනෝමතික අර්ථ දැක්වීමක් සඳහා පමණි. එම විවිධ අරා දෙක සමාන යැයි ඔබ සිතන්නේ ඇයි? ඔබ මෙහි ක්‍රියාත්මක කිරීමට උත්සාහ කරන 'සමානාත්මතාව' පිළිබඳ සංකල්පය හෝ එය සංවේදී හෝ ප්‍රයෝජනවත් එකක් වන්නේ මන්දැයි ඔබ පැහැදිලි කර නැත, නමුත් ඔබට පෙනෙන්නේ බහුමානීය අරා ඒවා තනි මානයකට කඩා වැටී ඇති ආකාරයට සැසඳිය යුතු බවයි. ඒවා. එසේ නම්, ඔබ එය සාක්ෂාත් කර නොගත්තේය: [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. එක් අරාවක් හරහා ගමන් කිරීමට අඩු කරන්නා භාවිතා කර අනෙක් අරාවෙහි එක් එක් අයිතමය සොයන්න. එක් අයිතමයක් සොයාගත නොහැකි වුවහොත් අඩු කිරීමේ ශ්‍රිතය 'අසත්‍යය'
ඩෙල්ස්

EDEls: ඔබේ පැහැදිලි කිරීම පිළිතුරට සංස්කරණය කර ඇත (තරමක් නැවත සකස් කර දීර් extended කර ඇත). ඔබට දැන් ඔබගේ අදහස් ඉවත් කර පළමු අදහස සහ මෙය යල්පැන ඇති එකක් ලෙස සලකුණු කරන්න.
අවසානයේ උත්සාහ කරන්න

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

ආවර්තනික සහ වැඩ කරන පතරෙහි අරා:

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

සමග ක්රියාත්මක වන බහු සමග තර්ක පතරෙහි අරා:

//: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"   ]]],
));; 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.