2011-12-21 97 views

回答

12

找到一种方法来检查使用此CoffeeScript chapter两个数组之间的交集。 CoffeeScript看起来非常棒。

如果在元素相交后得到的数组至少包含一个项目,那么两个数组都有公共元素。

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

+0

嗯,我感到相当的第一行迷惑,和CoffeeScript的的核心优势之一是应该是增加JS的清晰度和可读性,对吧?也许这是一些聪明但复杂的代码,只有在@alessioalex提供的更清晰的代码效率更高时才能使用。 – GregL 2011-12-21 05:57:31

+0

@GregL - 你的意思是这条线 - 'intersection =(a,b) - >'? – Anurag 2011-12-21 06:53:11

+0

对不起,我的意思是第2行,这是交集函数的第一行。到目前为止,我已经学会了足够的CS语法来读取第一行。 :-)更多的是我不明白这条线是如何工作的。 – GregL 2011-12-21 07:36:30

1

我做了一个功能IS_IN,看一下我的例子:

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

在看看交叉口例子,我可以以另一种方式实现这一目标:

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

前者更容易理解 - 如果有人想为此创建一个jsPerf.com测试,看看您发布的交叉码是否有任何好处,我会很好奇。 – GregL 2011-12-21 05:59:46

+0

你可以自己创建一个jsPerf测试。点击两个'Test here'链接,然后从那里获取已编译的JavaScript代码。之后,创建一个jsPerf与2例。 – alessioalex 2011-12-21 08:49:53

1

你可以试试:

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

(扭转阵列显示array1双项)

7

想我应该把我自己的CoffeeScript的一行疯狂:-P

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

以防万一有人来到这里,并寻找差异,而不是相交

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

这会给你一个数组中阵列1的所有值(差异但不是在数组2

相关问题