2013-10-30 32 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])

會工作。