2010-08-08 2 views
8

En supposant que nous avons:La comparaison de deux tableaux en Javascript - différences de retour

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

est-il une solution éprouvée et rapide pour comparer deux tableaux les uns contre les autres, retourner un tableau sans les valeurs apparaissant dans les deux tableaux (C et E ici). Alors :

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

devrait être la sortie de la solution. (jquery peut être impliqué)

thx.

+0

-ce que les tableaux à la fois toujours triés, comme dans votre exemple? Si c'est le cas, cela peut être fait en temps linéaire en marchant simplement dans les tableaux. –

Répondre

11

Il s'agit d'une différence de réglage. Une implémentation simple est:

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

Ceci est O (m * n), où ce sont les tailles des tableaux. Vous pouvez le faire dans O (m + n), mais vous devez utiliser une sorte de jeu de hachage. Vous pouvez utiliser un objet JavaScript comme un ensemble de hachage simple pour les chaînes. Pour les réseaux relativement petits, ce qui précède devrait être bon.

+0

thx, ceci est une belle solution courte. – Hans

+0

S'il vous plaît envisager de mettre à jour cette réponse pour utiliser Array.prototype.filter au lieu de jQuery.grep, car il fournira une solution même si jQuery n'est pas autorisé. –

+0

[Array.prototype.filter] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) est en effet une alternative sans bibliothèque. Cependant, vous avez besoin de [Array.prototype.indexOf] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) aussi (au lieu de inArray). Cependant, les deux nécessitent le chargement d'un polyfill (fourni sur les liens) dans les anciens navigateurs pour obtenir une large compatibilité. Depuis la question autorisée jQuery, je suis allé avec cela car il a son propre polyfill. –

0

Une solution rapide éprouvée que je connais est une recherche binaire que vous pouvez utiliser après avoir trié l'un des tableaux. donc la solution prend du temps qui dépend de l'algorithme de tri. mais est au moins log (N).

13

J'ai accepté la solution Matthews, mais je ne veux pas ignorer une autre solution plus rapide que je viens de trouver.

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

Source: Optimize Loops to Compare Two Arrays

+1

Cela m'a beaucoup aidé - merci de poster. – cantera

+0

Particulièrement agréable si l'une des listes (ici list2) doit être comparée à beaucoup de candidats (beaucoup de list1). – JPM

+1

sur Chrome, la référence source liée est repérée comme contenant des logiciels malveillants – superjos

Questions connexes