2011-09-13 3 views
5

Mi sto accumulando in un problema in JavaScript.Dato due array, restituisce una matrice costituita solo da elementi non intersecati

Ho due array e voglio verificare se si intersecano su alcuni elementi, quindi eliminare quegli elementi e restituire nuovo array senza gli elementi intersecati.

esempio:

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

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

voglio controllarli e ritorno:

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

Come posso fare questo in JavaScript?

+3

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

+0

thx per la risposta, ma questa domanda riguarda il ritorno di un array con elementi intersecati. Voglio cancellarli e restituire il resto in un nuovo array –

risposta

8

Checkout biblioteca underscore.js.

Diciamo che avete due array,

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

Prima trovano il sindacato.

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

Quindi trovare l'intersezione.

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

La risposta finale dovrebbe essere la differenza tra l'unione e l'intersezione.

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

+1 [Esempio di lavoro.] (http://jsbin.com/ayujef/edit#javascript, live) Probabilmente è sicuro che il codice di sottolineatura sia accettabile poiché jQuery apparentemente è già caricato. – user113716

+0

Grazie per l'esempio di lavoro: sembra fantastico :) .. Underscore è simile a jQuery in filosofia e la dimensione non è troppo grande, ma tutto dipende dai requisiti dell'OP. – Anurag

2

Ebbene, dal momento che è stato specificato jQuery, provate questo:

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

Probabilmente non è molto efficiente, ma è relativamente concisa.

+0

thankx per la risposta, ma come posso implementare questo e restituire un array senza gli elementi intersecati ??? –

+0

aggiornato la mia risposta – Blazemonger

4

Utilizzando Array.filter, Array.lastIndexOf, e 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); 
        }) 

Nessuno dei due metodi è al 100% cross browser di default, ma entrambi i collegamenti con spessori di sicurezza per IE < = 8

+0

grazie abstractdownvotefactor, gli array sono immagazzinati in una var e non conoscono gli indici né gli elementi. –

+0

va bene, modifico per dimostrarlo. – Joe

+0

Questo non fornirà elementi in 'array2' che non appaiono in' array1'. L'esempio di OP sembra suggerire che tutti i valori unici siano mantenuti. – user113716

0

soluzione Plain js, non è efficiente come quando si utilizza 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

Non si dovrebbe davvero usare 'for-in' su un array * (in JavaScript) *. – user113716

+0

ho finalmente utilizzato il plug-in underscore e il codice di @anurag. grazie per l'aiuto –

+0

@patrick dw : concordato sul fatto che for-in non dovrebbe essere usato in javascript dove l'ordine di analisi degli elementi è importante, questo è l'unico neo, penso. – mooglife

Problemi correlati