2010-08-08 19 views
8

asumiendo que tenemos:La comparación de dos matrices en Javascript - diferencias que vuelven

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

¿Existe una probada y solución rápida para comparar dos matrices uno contra el otro, volviendo una matriz sin los valores que aparecen en ambas matrices (C y E aquí). Así :

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

debería ser la salida de la solución. (jquery puede estar involucrado)

thx.

+0

son las matrices de ambos siempre ordenados, como en el ejemplo? Si es así, esto se puede hacer en tiempo lineal simplemente caminando las matrices. –

Respuesta

11

Esta es una diferencia establecida. Una implementación simple es:

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

Esto es O (m * n), donde están los tamaños de las matrices. Usted puede hacerlo en O (m + n), pero necesita utilizar algún tipo de conjunto de hash. Puede usar un objeto de JavaScript como un conjunto de hash simple para cadenas. Para matrices relativamente pequeñas, lo anterior debería estar bien.

+0

thx, esta es una buena solución corta. – Hans

+0

Considere actualizar esta respuesta para usar Array.prototype.filter en lugar de jQuery.grep ya que proporcionará una solución incluso si jQuery no está permitido. –

+0

[Array.prototype.filter] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) es una alternativa sin biblioteca. Sin embargo, también necesita [Array.prototype.indexOf] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) (en lugar de inArray). Sin embargo, ambos requieren cargar un polyfill (proporcionado en los enlaces) en navegadores más antiguos para lograr una amplia compatibilidad. Dado que la pregunta permitía jQuery, fui con eso ya que tiene su propio relleno policristalino. –

0

una solución rápida comprobada que conozco es una búsqueda binaria que puede usar después de ordenar una de las matrices. entonces la solución toma tiempo que depende del algoritmo de clasificación. pero es al menos log (N).

13

Acepté Matthews Solution, pero no quiero ignorar una solución diferente más rápida que acabo de encontrar.

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

Fuente: Optimize Loops to Compare Two Arrays

+1

Esto me ayudó mucho, gracias por publicar. – cantera

+0

Particularmente agradable si una de las listas (aquí list2) necesita ser comparada con muchos candidatos (muchos list1). – JPM

+1

en Chrome, se considera que la referencia de origen vinculada contiene malware – superjos

Cuestiones relacionadas