2010-08-08 17 views
8

Supponendo che abbiamo:Confrontando due array in Javascript - Returning differenze

array1 = ['A', 'B', 'C', 'D', 'E']; array2 = ['C', 'E']; 

Esiste una provata e soluzione veloce per confrontare due matrici uno contro l'altro, restituendo un array senza i valori che compaiono in entrambi gli array (C e E qui). Quindi:

array3 = ['A', 'B', 'D'] 

dovrebbe essere l'uscita della soluzione. (jquery potrebbe essere coinvolto)

thx.

+0

Sono gli array sia sempre ordinati, come nel tuo esempio? Se è così, questo può essere fatto in tempo lineare semplicemente camminando sugli array. –

risposta

11

Questa è una differenza di set. Un'implementazione semplice è:

jQuery.grep(array1, function(el) 
        { 
         return jQuery.inArray(el, array2) == -1; 
        }); 

Questo è O (m * n), dove quelle sono le dimensioni degli array. È possibile farlo in O (m + n), ma è necessario utilizzare una sorta di set di hash. È possibile utilizzare un oggetto JavaScript come un semplice set di hash per le stringhe. Per array relativamente piccoli, quanto sopra dovrebbe andare bene.

+0

thx, questa è una bella soluzione breve. – Hans

+0

Si prega di considerare l'aggiornamento di questa risposta per utilizzare Array.prototype.filter anziché jQuery.grep poiché fornirà una soluzione anche se jQuery non è consentito. –

+0

[Array.prototype.filter] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) è in effetti un'alternativa senza libreria. Tuttavia, è necessario [Array.prototype.indexOf] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) (invece di inArray). Tuttavia, entrambi richiedono il caricamento di un polyfill (fornito nei collegamenti) nei browser meno recenti per ottenere un'ampia compatibilità. Poiché la domanda ha permesso jQuery, sono andato con quello poiché ha il suo polyfill. –

0

una soluzione rapida e provata che conosco è una ricerca binaria che è possibile utilizzare dopo aver ordinato uno degli array. quindi la soluzione richiede tempo che dipende dall'algoritmo di ordinamento. ma è almeno log (N).

13

Ho accettato Matthews Solution, ma non voglio ignorare una soluzione più veloce che ho appena trovato.

var list1 = [1, 2, 3, 4, 5, 6]; 
var list2 = ['a', 'b', 'c', 3, 'd', 'e']; 
var lookup = {}; 

for (var j in list2) { 
     lookup[list2[j]] = list2[j]; 
    } 

    for (var i in list1) { 
     if (typeof lookup[list1[i]] != 'undefined') { 
      alert('found ' + list1[i] + ' in both lists'); 
      break; 
} 
} 

Fonte: Optimize Loops to Compare Two Arrays

+1

Questo mi ha aiutato molto, grazie per aver pubblicato. – cantera

+0

Particolarmente bello se una delle liste (qui lista2) deve essere confrontata con molti candidati (molti lista1). – JPM

+1

su Chrome, il riferimento sorgente collegato viene individuato come contenente malware – superjos

Problemi correlati