我想知道两个或多个数组是否有共同的项目,但我不关心这些项目是什么。我知道 lodash 有一个
_.intersection
方法,但我不需要它来遍历每个数组的每个项目。相反,我需要类似 _.hasIntersection
的方法,一旦找到第一个常见的情况,它将停止在数组中查找。 lodash有类似的东西吗?
这种方法可以让您有效地搜索任意数量的数组中的交集。
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() 函数。这会产生一组布尔值,true 意味着其中一个集合中有一个相交值。下一步是使用 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
死灵香草法师说
Array.some
和Array.includes
都提前停止了。
const hasIntersection = (smArray, lgArray) =>
smArray.some(needle => lgArray.includes(needle));