2015-04-15 17 views
5

Let dire che ho 2 campiC'è un modo per verificare se due array hanno gli stessi elementi?

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

Voglio sapere se contengono gli stessi elementi, mentre l'ordine non è importante. So che posso scrivere una funzione per ordinarli e quindi passarli in loop per controllare, ma esiste una funzione predefinita per questo? (Non solo Vanilla JS, altra libreria javascript è anche bene)

+0

tutti gli elementi sono unici nella matrice ?? – Pratik

+0

@Pratik No, confrontando i due array. – Scimonster

+0

Sì per il mio caso, ma sarebbe meglio se potesse gestire anche elementi duplicati. – cytsunny

risposta

4

utilizzando jQuery

È possibile confrontare i due array utilizzando jQuery:

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

Ecco un JsFiddle Demo

Vedere questa domanda helpful answer

+0

Non mi piace che il nome sia Identico come identico dovrebbe includere anche l'ordine, ma il modo di fare è grande. – cytsunny

+0

@ user1273587 Grazie. Quale nome variabile useresti qui? L'ho preso in considerazione per qualche istante, ma non avevo alternative migliori. Aggiornamento benvenuto! –

+0

E riguardo sameSet()? – cytsunny

1

Beh c'è un metodo Array.sort() in JavaScript, e per confrontare le matrici (ordinate), penso che sia meglio controllare this question, in quanto è ha davvero buona risposta.

Soprattutto notare che il confronto array come stringhe (per esempio mediante JSON.stringify) è un pessima idea, come valori come "2,3" potrebbero rompere tale controllo.

+0

Penso che OP sia già a conoscenza della soluzione che hai citato – thefourtheye

+0

Array.sort() modifica l'array attuale. Vale la pena clonare l'array, quindi ordinarlo e quindi controllare ogni elemento in modo iterativo. – shmuli

-1
Non

in Vanila Javascript, ma in Angolare c'è un'opzione per abbinare due oggetti.

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

Determina se due oggetti o due valori sono equivalenti. Supporta tipi di valore, espressioni regolari, matrici e oggetti.

Vedere se questo può essere di aiuto.

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>

Clicca sul codice Run snippet. Se questo risolve il tuo bisogno, contrassegnalo come Risposta :)

Nel caso in cui l'ordine non sia importante e la matrice sia di tipo numerico.

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

Prova '[1, 2, 3]' e '[3, 2, 1]'. OP vuole 'true' per questo caso. – thefourtheye

+0

in questo caso puoi andare direttamente per il semplice codice Javascript. var a1 = [1, 2, 3]; var a2 = [2, 1, 3]; Avviso (eval (JSON.stringify (a1) .replace (/,/g, "+"). Replace (/ \ [/ g, "") .replace (/ \]/g, "")) == = eval (JSON.stringify (a2) .replace (/,/g, "+"). replace (/ \ [/ g, "") .replace (/ \]/g, ""))); – Sam4Code

+0

Confrontare un array con una stringa non è corretto. Vedi http://stackoverflow.com/questions/7837456/comparing-two-arrays-in-javascript – cytsunny

0

Ecco un'implementazione di lavoro utilizzando Vanilla JS:

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

Questo analizza delle corde di un numero in diverse matrici e li controlla separatamente. Ciò correggerà il problema di 1 e "1" corrispondente a true a causa della conversione implicita del tipo causata dalla funzione sort.

L'implementazione è semplice:

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

var results = haveMatchingElements(arr1, arr2); 
console.log(results); // true 
Problemi correlati