2015-04-02 42 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));