2011-12-21 21 views

cevap

12

Bu CoffeeScript chapter'u kullanarak iki dizi arasındaki kesişimi denetlemenin bir yolunu bulun. CoffeeScript şuna oldukça güzel gözüküyor.

Öğelerin kesişiminden sonra ortaya çıkan dizi en az bir öğe içeriyorsa, her iki dizinin de ortak öğelere/bileşenlere sahip olması gerekir.

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"] 

here.

benim örneği inceleyelim, bir işlev is_in yaptık
+0

Hmmm, oldukça ilk satırda karıştı ve CoffeeScript temel avantajlarından biri oldu JS'nin açıklığı ve okunabilirliği artırılmalı mıydı? Belki de bu, zeki ama karmaşık olan bir kod örneğidir ve yalnızca @alessioalex'in sağladığı daha temiz kodun daha verimli olması durumunda kullanılmalıdır. – GregL

+0

@GregL - Bu satırı demek istiyorsun - 'intersection = (a, b) ->'? – Anurag

+0

Üzgünüm, hayır, kesişme işlevinin ilk satırı olan # 2 satırını kastediyorum. İlk satırı okuyabilmek için şu ana kadar yeterli CS sözdizimini öğrendim. :-) Daha çok, bu hattın nasıl çalıştığını anlamıyorum. – GregL

1

: kesişim örneğe göz ettikten sonra

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

, başka şekilde bunu başarabilirsiniz:

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

Önceden anlaşılması daha kolay - Eğer birisi, ikinci kez gönderdiğiniz kesişim kodunun herhangi bir yararı olup olmadığını görmek için bunun için bir jsPerf.com testi oluşturmak isterse merak ediyorum. – GregL

+0

Kendiniz bir jsPerf testi oluşturabilirsiniz. 'Buraya test' bağlantılarını tıklayın ve ardından derlenmiş JavaScript kodunu buradan alın. Bundan sonra 2 vaka ile bir jsPerf oluşturun. – alessioalex

1

Sen deneyebilirsiniz:

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

7

ben atmak istiyorum Düşünce kendi CoffeeScript tek satırlık delilik :-P

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

Sadece durumda birisi (array1 çift girişleri göstermek için diziler ters) buraya gelir ve

difference = (val for val in array1 when val not in array2) 
0 arasındaki farkın karşılığını aramaktadır

Bu dizi1 tüm değerlerin (farkı) ancak dizi2 size bir dizi verecektir