2015-04-02 44 views
3

我想知道兩個或多個數組是否具有共同項目,但我不在乎這些項目是什麼。我知道lodash有一個_.intersection方法,但我不需要它來遍歷每個數組中的每個項目。相反,我需要類似_.hasIntersection方法的方法,它會在找到第一個常見事件時停止查找數組。 lodash有類似的東西嗎?Lodash _.hasIntersection?

回答

2

這種方法可以讓你有效地在數組中的任意數量的搜索的交集。

function hasIntersection() { 
    var collections = _.rest(arguments); 

    return _.some(_.first(arguments), function(item) { 
     return _(collections) 
      .chain() 
      .map(_.ary(_.partial(_.includes, item), 1)) 
      .compact() 
      .size() 
      .isEqual(collections.length) 
      .value(); 
    }); 
} 

hasIntersection()功能通過創建collections開始了,這些都是我們要尋找在交叉值的集合,減去第一個。它返回值some(),它使用first()數組參數迭代,回調到some()比較傳遞給該函數的所有其他數組。

這是通過包裝collections並建立一個調用鏈來完成的。它使用chain()來啓用顯式鏈接,因爲我們想在鏈的末尾鏈接isEqual()size()

我們將collections變量(一組數組)映射到includes()函數。這會產生一個布爾值數組,這意味着其中一個集合中存在相交值。下一步是使用compact()刪除錯誤的值。我們留下的是相交集合的數量。

如果相交集合的數量與collections的長度相同,我們找到了一個跨所有集合相交的值,並且可以退出。這種做法是因爲some()includes()

hasIntersection([ 1, 2 ], [ 2, 3 ]); 
// → true 

hasIntersection([ 1, 2, 3 ], [ 2, 4, 5 ], [ 2 ]); 
// → true 

hasIntersection([ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ]); 
// → false 
+0

說回這幾年以後的短路到位的高效,這似乎並沒有工作了。看來'_.rest'需要一個函數。這是一個突破變化嗎? – adam0101 2017-06-19 22:07:58

+0

這演示了這個問題:https://plnkr.co/edit/njV7Q4mqI4VP1SHyNGjK?p=preview – adam0101 2017-06-19 22:18:05

2

你可以簡單地使用someincludes

var hasIntersection = _.some(arr1, _.ary(_.partial(_.includes, arr2), 1));