2015-04-15 7 views
5

Lassen Sie sagen, ich habe 2 ArraysGibt es eine Möglichkeit zu überprüfen, ob zwei Arrays die gleichen Elemente haben?

firstArray = [1, 2, 3, 4, 5]; 
secondArray = [5, 4, 3, 2, 1]; 

ich, wenn sie dieselben Elemente enthalten wissen wollen, während Auftrag nicht wichtig ist. Ich weiß, dass ich eine Funktion schreiben kann, um sie zu sortieren und dann durchzuschleifen, um sie zu überprüfen, aber gibt es dafür eine vordefinierte Funktion? (Nicht nur Vanille JS, andere Javascript-Bibliothek auch in Ordnung ist)

+0

Alle Elemente sind einzigartig in dem Array ?? – Pratik

+0

@Pratik Nein, Vergleich der beiden Arrays. – Scimonster

+0

Ja für meinen Fall, aber es wäre besser, wenn es auch duplizierte Elemente verarbeiten kann. – cytsunny

Antwort

4

Mit jQuery

Sie die beiden Arrays jQuery mit vergleichen kann:

// example arrays: 
var firstArray = [ 1, 2, 3, 4, 5 ]; 
var secondArray = [ 5, 4, 3, 2, 1 ]; 

// compare arrays: 
var isSameSet = function(arr1, arr2) { 
    return $(arr1).not(arr2).length === 0 && $(arr2).not(arr1).length === 0; 
} 

// get comparison result as boolean: 
var result = isSameSet(firstArray, secondArray); 

hier ein

JsFiddle Demo ist diese Frage finden Sie in Vanila Javascript helpful answer

+0

mag nicht den Namen IsIdentical als identisch sollte Reihenfolge enthalten, aber die Art und Weise zu tun ist großartig. – cytsunny

+0

@ user1273587 Danke. Welchen Variablennamen würden Sie hier verwenden? Ich überlegte kurz, hatte aber keine bessere Alternative. Update willkommen! –

+0

Wie wäre es mit sameSet()? – cytsunny

1

Nun gibt es eine Array.sort() Methode in JavaScript, und zum Vergleichen des (sortierte) Arrays, ich glaube, es ist am besten this question zu überprüfen, da es eine wirklich hat gute Antwort.

Besonders beachten Sie, dass Arrays als Strings (zum Beispiel durch JSON.stringify) ist ein sehr schlecht Idee zu vergleichen, als Werte wie "2,3" könnte eine solche Überprüfung durchbrechen.

+0

Ich denke OP ist bereits bekannt, die Lösung, die Sie erwähnten – thefourtheye

+0

Array.sort() modifiziert das eigentliche Array. Es lohnt sich, das Array zu klonen, es dann zu sortieren und dann jedes Element iterativ zu überprüfen. – shmuli

-1

Nicht aber in Winkelförmig gibt es die Möglichkeit, zwei Objekte zu vergleichen.

angular.equals([1,2,3],[1,2,3]) 

Bestimmt, ob zwei Objekte oder zwei Werte äquivalent sind. Unterstützt Werttypen, reguläre Ausdrücke, Arrays und Objekte.

Sehen Sie, ob dies Ihnen helfen könnte.

alert("Match result of [1,2,3] & [1,2,3] is "+angular.equals([1,2,3],[1,2,3])); 
 

 
alert("Match result of [1,4,3] & [1,2,3] is "+angular.equals([1,4,3],[1,2,3]));
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

Klicken Sie auf Run-Code-Schnipsel. Wenn dies Ihren Bedarf löst, markieren Sie bitte als Antwort :)

Falls die Reihenfolge nicht wichtig ist und das Array vom Nummerntyp ist.

var a1 = [1, 2, 3]; 
 
var a2 = [2, 1, 3]; 
 
//In case order is not important and array is of number type. 
 
alert(eval(JSON.stringify(a1).replace(/,/g, "+").replace(/\[/g, "").replace(/\]/g, "")) === eval(JSON.stringify(a2).replace(/,/g, "+").replace(/\[/g, "").replace(/\]/g, "")));

+0

Probieren Sie '[1, 2, 3]' und '[3, 2, 1]' aus. OP möchte für diesen Fall "wahr" sein. – thefourtheye

+0

In diesem Fall können Sie direkt für plain Javascript-Code gehen. var a1 = [1, 2, 3]; var a2 = [2, 1, 3]; alert (eval (JSON.stringify (a1) .replace (/,/g, "+"). Ersetze (/ \ [/ g, "") .replace (/ \)/g, "")) == = eval (JSON.stringify (a2) .replace (/,/g, "+"). ersetzen (/ \ [/ g, "") .replace (/ \)/g, "")); – Sam4Code

+0

Vergleichen eines Arrays nach String ist ein schlechter Weg. Siehe http://stackoverflow.com/questions/7837456/comparing-two-arrays-in-javascript – cytsunny

0

Hier ist eine funktionierende Implementierung Vanilla JS mit:

function haveMatchingElements(firstArray, secondArray) { 
    var stringsInFirstArray = parse(firstArray, 'string'), 
     stringsInSecondArray = parse(secondArray, 'string'), 
     numbersInFirstArray = parse(firstArray, 'number'), 
     numbersInSecondArray = parse(secondArray, 'number'), 
     stringResults = compare(stringsInFirstArray, stringsInSecondArray), 
     numberResults = compare(numbersInFirstArray, numbersInSecondArray); 

    if (stringResults && numberResults) { 
     return true; 
    } return false; 

    function parse(array, type) { 
     var arr = []; 
     arr = array.sort().filter(function(index) { 
      if (typeof index == type) 
       return index; 
     }); 
     return arr; 
    } 

    function compare(firstArray, secondArray) { 
     if (firstArray.length !== secondArray.length) 
      return false; 
     for (var i = firstArray.length; i--;) { 
      if (firstArray[i] !== secondArray[i]) 
       return false; 
     } 
     return true; 
    } 
} 

Diese Strings eine Zahlen in verschiedenen Arrays analysiert und prüft sie separat. Das wird das Problem von 1 und "1" korrigieren, die als true aufgrund der impliziten Typkonvertierung durch die sort-Funktion verursacht werden.

Die Implementierung ist einfach:

var arr1 = ['1', 1]; 
var arr2 = [1, '1']; 

var results = haveMatchingElements(arr1, arr2); 
console.log(results); // true 
Verwandte Themen