2011-09-13 13 views
5

Me estoy apilando en un problema en JavaScript.Dadas dos matrices, devuelven una matriz que consta únicamente de los elementos que no se intersectan

Tengo dos matrices y quiero verificar si se cruzan en algunos elementos, luego eliminar esos elementos y devolver una nueva matriz sin los elementos intersecados.

ejemplo:

Array A ( 
[0] => 0 [1] => 1 
) 

Array B ( 
[0] => 2 [1] => 1 
) 

Quiero comprobar y volver:

Array result ( 
[0] => 0 [1] => 2 
) 

¿Cómo puedo hacer esto en JavaScript?

+3

http://stackoverflow.com/questions/1885557/simplest-code-for- array-intersection-in-javascript – Gerry

+0

thx para la respuesta, pero esta pregunta se trata de devolver una matriz con elementos intersecados. Quiero eliminarlos y devolver el resto en una nueva matriz –

Respuesta

8

Pedido la biblioteca underscore.js.

Digamos que tiene dos matrices,

var a = [1, 2]; 
var b = [2, 3]; 

En primer lugar encontramos la unión.

var all = _.union(a, b); 

Luego encuentra la intersección.

var common = _.intersection(a, b); 

La respuesta final debe ser la diferencia entre la unión y la intersección.

var answer = _.difference(all, common) 
+2

+1 [Ejemplo de trabajo.] (http://jsbin.com/ayujef/edit#javascript, live) Probablemente es seguro suponer que el código de subrayado es aceptable ya que jQuery aparentemente ya está cargado. – user113716

+0

Gracias por el ejemplo de trabajo: se ve genial :) .. Underscore es similar a jQuery en filosofía y el tamaño tampoco es demasiado grande, pero todo depende de los requisitos de OP. – Anurag

2

Bueno, ya que ha especificado jQuery, intente esto:

var arr1 = [2, 3, 4]; 
var arr2 = [1, 2, 3]; 

var arr3 = $.merge($.grep(arr1, function(el, idx) { 
    return $.inArray(el, arr2) > -1; 
}, true), $.grep(arr2, function(el, idx) { 
    return $.inArray(el, arr1) > -1; 
}, true)); 

alert(arr3); 

Probablemente no es muy eficiente, pero es relativamente concisa.

+0

gracias por la respuesta, pero ¿cómo puedo implementar esto y devolver una matriz sin los elementos intersecados ??? –

+0

actualizó mi respuesta – Blazemonger

4

Usando Array.filter, Array.lastIndexOf, y Array.indexOf:

var array1 = [1,2,3,4,5]; 
var array2 = [2,3]; 
var unique = array1.concat(array2) 
        .filter(function (item, index, array) { 
         return array.indexOf(item) == array.lastIndexOf(item); 
        }) 

Ni método es 100% cruz navegador por defecto, pero ambos enlaces que tiene cuñas de seguridad para IE < = 8

+0

gracias abstractdownvotefactor, las matrices están almacenadas en una var y no conocen ni los índices ni los elementos. –

+0

está bien, voy a editar para demostrar eso. – Joe

+0

Esto no le dará elementos en 'array2' que no aparecen en' array1'. El ejemplo de OP parece sugerir que se conservan todos los valores únicos. – user113716

0

solución Llanura js, no es tan eficiente como cuando se utiliza jQuery:

function filter(a1, a2){ 
 
    var result = []; 
 
    for(i in a1){ 
 
    exists = false; 
 
    for(j in a2){ 
 
     if(a1[i] == a2[j]) 
 
     exists = true; 
 
    } 
 
    if(exists== false){ 
 
     result.push(a1[i]); 
 
    } 
 
    } 
 
    return result; 
 
} 
 

 
var arr1 = [1,2,3,4,5]; 
 
var arr2 = [4,5,6,7,8]; 
 
var result1 = filter(arr1, arr2); 
 
var result2 = filter(arr2, arr1); 
 

 
var result = result1.concat(result2);

+0

Realmente no debería usar 'for-in' en una Matriz * (en JavaScript) *. – user113716

+0

Finalmente utilicé el complemento de subrayado y el código de @anurag. Gracias por la ayuda –

+0

@patrick dw : acordó que for-in no debería utilizarse en javascript, donde el orden de análisis de los elementos es importante. Esa es la única desventaja, creo. – mooglife

Cuestiones relacionadas