2011-05-06 12 views
6

Quiero obtener valores únicos de dos matrices diferentes.¿Cómo encontrar registros únicos de dos matrices diferentes en jquery o javascript?

Dos matrices son las siguientes en JavaScript:

<script> 
var a=new Array; 
var b=new Array; 
a={'a','b','c','d','e'} 
b={'a','d','e','c'} 
</script> 

quiero una salida como:

new array => {'a','c','d','e'} 

¿Cómo puedo encontrar los registros únicos de ambas matrices usando prototipo de la función JavaScript o función jQuery?

Respuesta

7

No sé si los términos son correctos. Los valores únicos para mí serían los miembros que aparecen una sola vez en cualquiera de las matrices. Parece que quieres miembros que estén presentes en ambas matrices (valores comunes), según tu ejemplo.

Puede usar jQuery para manejar esto. grep() es tu amigo.

Puede hacerlo sin jQuery, pero no estoy seguro si los métodos nativos filter() y indexOf() tienen la mejor compatibilidad con el navegador.

var a = ['a', 'b', 'c', 'd', 'e'], 
    b = ['a', 'd', 'e', 'c']; 

var common = $.grep(a, function(element) { 
    return $.inArray(element, b) !== -1; 
}); 

console.log(common); // ["a", "c", "d", "e"] 

jsFiddle.

+0

@alex Gracias por responder, pero obtengo la consola en undefined .. en el ejemplo de Jsfiddle .., utilicé Jquery 1.3.2 .min.js en mi aplicación ... Es de otra manera ... –

+1

@Abhishek Eso solo significa que no tienes un objeto de consola. [Pruebe esto] (http://jsfiddle.net/alexdickson/QDhFD/). – alex

+0

@alex Muchas gracias ... –

1

Encuentra respuesta orignal: JavaScript array difference

Se puede usar un Set en este caso. Está optimizado para este tipo de operación (unión, intersección, diferencia).

Asegúrese de que se aplica a su caso, una vez que no permite duplicados.

var a = new JS.Set([1,2,3,4,5,6,7,8,9]); 
var b = new JS.Set([2,4,6,8]); 

a.intersection(b);//intersect will give you the common one 
+0

Gracias, quiero obtener valores únicos de dos matrices no difieren. –

+0

@Abhishek - compruebe el enlace establecido en que hay operaciones disponibles para eso también –

+0

Gracias @PranayRana .. –

1

Me gustaría hacer esta operación con la ayuda del soporte de matriz asociativa en JavaScript.

<script> 
var a=new Array; 
var b=new Array; 
a={'a','b','c','d','e'} 
b={'a','d','e','c'} 

var uniqueArray = new Array; 
var tempArray = new Array; 

var j = 0; 
for(var i = 0; i < a.length; i++) { 
    if(!tempArray[a[i]]) { 
     tempArray[a[i]] = true; 
     uniqueArray[j++] = a[i]; 
    } 
} 

for(i = 0; i < b.length; i++) { 
    if(!tempArray[b[i]]) { 
     tempArray[b[i]] = true; 
     uniqueArray[j++] = b[i]; 
    } 
} 

</script> 
+0

Gracias @James, buena respuesta, pero lo quiero de manera fácil con código administrado ... –

1

De esta manera:

var a=['a','b','c','d','e']; //Use brackets 
var b=['a','d','e','c'] 

var c = a.concat(b).sort(); 

var uniques = {}; 

for(var i=0; i<c.length; i++){ 
    uniques[c[i]] = true; 
} 
var uniquesArray = []; 
for(var u in uniques) 
    uniquesArray.push(u) 

Ahora uniquesArray contiene sólo valores únicos. espero que esto ayude

+0

Gracias @Edgar Villegas Alvarado .. –

+0

Me gusta esta solución para encontrar valores 'distintos' , pero para mí 'único' significaría solo valores que aparecen una vez en cualquiera de las matrices. Pero yendo por la salida esperada de la muestra en el OP, creo que lo que realmente se busca aquí son los valores 'comunes', es decir, los que existen en ambas matrices. – nnnnnn

2

Creo que realmente significa que escribir:

<script type="text/javascript"> 
var a = ['a','b','c','d','e']; 
var b = ['a','d','e','c']; 
</script> 

En cualquier caso, puede ordenar las matrices y obtener los valores de una que no están en el otro y viceversa, a continuación, concatenar los dos conjuntos en uno. Parece que tiene muchas opciones, así que aquí hay una buena versión básica de JavaScript que debería funcionar en la mayoría de los navegadores. El uso de nuevas funciones de los navegadores más recientes seguramente fallará en los navegadores más antiguos.

// Compares a to b. Returns all the elements in a that are not in b 
// If c provided, add unique elements to c 
function getUnique(a, b, c) { 
    var c = c || []; 
    var ta = a.slice().sort(); 
    var tb = b.slice().sort(); 
    var x, y, found = false; 
    for (var i=0, iLen=ta.length; i<iLen; i++) { 
    x = ta.shift(); 

    for (var j=0; j<tb.length && !found; j++) { // j.length changes each loop 
     if (tb[j] == x) { 
     tb.splice(j,1); // Remove match from b 
     found = true; 
     } 
    } 
    if (!found) { 
     c.push(x); // If no match found, store in result 
    } 
    found = false; 
    } 
    return c; 
} 
var a = ['a','b','d']; 
var b = ['b','e']; 

var d = getUnique(a, b); 
alert(d); 

var c = getUnique(b,a,d); 
alert(d); 

Pero su comentario sobre la primera respuesta indica que desea que los elementos que son comunes a ambas matrices, lo que es más simple:

function getCommon(a, b) { 
    var c = []; 
    var ta = a.slice().sort(); 
    var tb = b.slice().sort(); 
    var t, found; 

    for (var i=0, iLen=ta.length; i<iLen; i++) { 
    t = ta[i]; 
    found = false; 

    for (var j=0, jLen=tb.length; j<jLen && !found; j++) { 
     if (t == tb[j]) { 
     c.push(tb.splice(j,1)); 
     found = true; 
     } 
    } 
    } 
    return c; 
} 

alert(getCommon(a, b)); 

Es necesario trabajar decidir qué hacer con los duplicados. En el primer caso, los duplicados se tratarán como únicos si no hay un duplicado en la otra matriz.En lo anterior, los duplicados no importan a menos que estén duplicados en ambas matrices.

+0

Gracias a @RobG Gracias por contestar. –

+0

Gracias a @RobG ¿Es más rápido que la función grep? Cómo funciona mejor que la función jquery grep() –

+1

@Abhishek Casi siempre es más rápido hacer cosas sin una biblioteca. – alex

Cuestiones relacionadas