2016-09-15 1 views
2

Wie überprüfe ich die Gleichheit zwischen den Elementen von zwei Arrays ohne Verwendung externer Bibliotheken (und vorzugsweise mit ES5)?Überprüfen auf Gleichheit zwischen zwei Arrays

Ich möchte auf Gleichheit zwischen ihnen überprüfen, ohne sich um die Reihenfolge der Elemente kümmern. So sind die beiden Arrays [1,2,3] und [2,3,1] in meiner Situation gleich.

Ich glaube, ich eine Funktion

function isEqual(arr1, arr2) { 
    arr1.forEach(el => { 
    if (arr2.indexOf(el) === -1) { 
     return false; 
    } 
    }); 

    arr2.forEach(el => { 
    if (arr1.indexOf(el) === -1) { 
     return false; 
    } 
    }); 

    return true; 
} 
+0

Es gibt Unmengen von Fragen hier wie was, wenn sie in unterschiedlicher Länge sind und doppelte Elemente. – Redu

+0

Sind "[1,2,3]" und "[1,3,3,2]" auch für dich gleich? –

Antwort

3

können Sie JSON.stringify und Array#sort Methoden. Sortieren Sie beide Arrays und vergleichen Sie sie nach der Konvertierung in JSON-String.

function isEqual(arr1, arr2) { 
 
    return JSON.stringify(arr1.sort()) === JSON.stringify(arr2.sort()); 
 
} 
 

 
console.log(isEqual([1, 2, 3], [2, 3, 1])); 
 
console.log(isEqual([1, 2, 3], [2, 4, 1])); 
 
console.log(isEqual([1, 2, 3, 3], [2, 3, 1])); 
 
console.log(isEqual([1, 2, 3, 3], [2, 4, 1, 1]));


Oder statt JSON.stringify Sie auch Array#join Methode (Vorgeschlagen von @JonCarter), die es einfacher macht wenig nutzen können.

function isEqual(arr1, arr2) { 
 
    return arr1.sort().join() === arr2.sort().join(); 
 
} 
 

 
console.log(isEqual([1, 2, 3], [2, 3, 1])); 
 
console.log(isEqual([1, 2, 3], [2, 4, 1])); 
 
console.log(isEqual([1, 2, 3, 3], [2, 3, 1])); 
 
console.log(isEqual([1, 2, 3, 3], [2, 4, 1, 1]));

+0

Ich mag das - es ist kurz und elegant. Nur ein Vorschlag: Array.join() könnte etwas besser sein als JSON.stringify. z.B. 'arr1.sort(). join() === arr2.sort(). join()' –

+1

@ JonCarter: wow das wäre viel besser ..... danke und aktualisiert die Antwort mit Ihrem Vorschlag :) –

+1

Danke ! Tolle Lösung – Jamgreen

0

schreiben sollten Sie Array#every verwenden könnten die Werte gleich sind geltend zu machen. Dies ist jedoch sehr rudimentär, da es eine strenge Gleichheitsprüfung verwendet, die ihre Grenzen hat. Aber das zeigt den groben Rahmen für eine Iteration über das Array.

HINWEIS: Da es sich bei Arrays um indexbasierte Listen handelt, wird angenommen, dass sie für gleiche Werte gleiche Werte bei gleichem Index aufweisen müssen.

var arr1 = [1,2,3,4]; 
 
var arr2 = [1,2,3,4]; 
 
var arr3 = [1,2,4]; 
 
var arr4 = [1,2,2,4]; 
 

 
function isArrEql(a1, a2) { 
 
    return a1.length === a2.length && a1.every(function(v, i) { 
 
    return v === a2[i]; 
 
    }); 
 
} 
 

 
console.log('arr1, arr2: ', isArrEql(arr1, arr2)); 
 
console.log('arr1, arr2: ', isArrEql(arr1, arr3)); 
 
console.log('arr1, arr2: ', isArrEql(arr1, arr4));

+0

Aber ist 'a1.every ((v, i) => v === a2 [i])' das gleiche wie 'a2.every ((v, i) => v === a1 [i])' ? Muss ich nicht beide Wege prüfen? – Jamgreen

+0

@Jamgreen Das ist, wofür die Längenprüfung ist. Wenn beide Arrays die gleiche Länge haben, würde das Iterieren über eins und das Abgleichen des entsprechenden Werts von dem anderen Array das gleiche Ergebnis haben. –

Verwandte Themen