2011-12-21 19 views

risposta

12

Trovato un modo per verificare l'intersezione tra due array utilizzando questo CoffeeScript chapter. CoffeeScript sembra davvero impressionante guardando questo.

Se la matrice risultante dopo l'intersezione degli elementi contiene almeno un elemento, entrambi gli array hanno elementi comuni.

intersection = (a, b) -> 
    [a, b] = [b, a] if a.length > b.length 
    value for value in a when value in b 

x = ["hello", "two", "three"] 
y = ["hello"] 

intersection x, y // ["hello"] 

Provalo here.

+0

Hmmm, sono abbastanza confuso dalla prima linea, ed uno dei vantaggi principali di CoffeeScript ero dovrebbe essere maggiore chiarezza e leggibilità di JS, giusto? Forse questo è un caso di un codice che è intelligente ma complicato e dovrebbe essere usato solo se effettivamente più efficiente del codice più chiaro fornito da @alessioalex. – GregL

+0

@GregL - intendi questa riga - 'intersezione = (a, b) ->'? – Anurag

+0

Mi spiace, no, intendevo la linea n. 2, che è la prima riga della funzione di intersezione. Ho imparato abbastanza sintassi CS finora per essere in grado di leggere la prima riga. :-) È più che non capisco come quella linea "funzioni". – GregL

1

Ho fatto una funzione is_in, guarda il mio esempio:

array1 = ["hello","two","three"] 
array2 = ["hello"] 

is_in = (array1, array2) -> 
    for i in array2 
    for j in array1 
     if i is j then return true 

console.log is_in(array1, array2) 

Test here

Dopo aver dato un'occhiata l'esempio di intersezione, posso raggiungere questo obiettivo in un altro modo:

intersection = (a, b) -> 
    [a, b] = [b, a] if a.length > b.length 
    return true for value in a when value in b 

array1 = ["hello","two","three"] 
array2 = ["hello"] 

console.log intersection(array1, array2) 

Test here

+0

Il primo è molto più facile da capire - Sarei curioso se qualcuno volesse creare un test jsPerf.com per vedere se c'è qualche vantaggio nel codice di intersezione che hai postato per secondo. – GregL

+0

È possibile creare personalmente un test jsPerf. Fai clic sui due link "Prova qui" e poi prendi il codice JavaScript compilato da lì. Dopodiché crea un jsPerf con i 2 casi. – alessioalex

1

Si potrebbe provare:

(true for value in array1 when value in array2).length > 0 
2
contains = (item for item in array2 when item in array1) 

(invertire le matrici per mostrare doppie registrazioni in array1)

7

pensato che avrei buttare il mio CoffeeScript one-liner follia :-P

true in (val in array1 for val in array2) 
1

in caso qualcuno viene qui e sta cercando la differenza rispetto all'intersezione

difference = (val for val in array1 when val not in array2) 

questo vi darà un array (differenza) di tutti i valori in array1 ma non in array2

Problemi correlati