2013-10-30 30 views
0

我有一个任意长度的数组数组。我想计算交点。Underscore.js - foldl与交叉点

我试图用两种方式来做到这一点,我认为是等价的,但他们产生不同的输出。

之间有什么区别:

var a = [[1,2,3,4,5], [3, 4,5,6,7], [4,5,6,7,8]] 
_.foldl(a, function(a, b) { return _.intersection(a, b) }) 
// Works as expected -> [4, 5] 

这:

var a = [[1,2,3,4,5], [4,5,6,7], [5,6,7,8]] 
_.foldl(a, _.intersection) 
// Does not work -> [] 

有没有更好的方法来做到这一点?

+0

,但我仍然好奇 - 我使用foldl的两个实现有什么区别? – joews

+1

我不知道为什么第二个将无法正常工作。我尝试了'var func = function(a,b){return _.intersection(a,b)}'并调用'_.foldl(a,func)',它可以工作。我认为问题可能是'_.intersection'不知道要使用哪个参数,所以它使用'_.reduce'(备忘录,值,索引,列表)提供的所有四个参数,并且该列表使它不行。 – EmptyArsenal

回答

2

我觉得做的最好的方式,将使用applyintersection:我现在知道_.intersection.apply是一种更好的方式来做到这一点

var a = [[1,2,3,4,5], [3, 4,5,6,7], [4,5,6,7,8]]; 
_.intersection.apply(null, a); 
// -> returns [ 4, 5 ] 
2

_.intersection需要任意数量的数组。

只需使用

_.intersection(arrayA, arrayB, arrayC, ...); 

或者,如果你有数组

_.intersection.apply(_, arrayOfArrays); 
+0

我不知道我有多少阵列,所以我不能使用第一种形式,但第二种适用于我。谢谢。 – joews

3

数组你并不需要在这里一折。可以使用多个数组。

所以_.intersection.apply(null, a)

_.intersection([1, 2, 3, 4, 5], [4, 5, 6, 7], [5, 6, 7, 8])

会工作。