我想知道两个或多个数组是否有公共项,但我不在乎这些项是什么。我知道霍达什有一个_.intersection方法,但我不需要它来运行每个数组的每一个项目。相反,我需要一个类似于_.hasIntersection方法的东西,一旦找到第一个常见的情况,它就会停止查看数组。房客有这样的东西吗?
发布于 2015-04-02 17:48:41
这种方法允许您在任意数量的数组中高效地搜索一个交集。
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()的回调将比较传递给该函数的所有其他数组。
这是通过包装collections和构建一个调用链来完成的。它使用链()启用显式链接,因为我们希望在链的末尾将isEqual()链接到大小()。
我们将collections变量(数组的数组)映射到包括()函数。这就产生了一个布尔值数组,真正的意思是其中一个集合中有一个相交的值。下一步是使用紧凑()删除falsey值。剩下的是交叉集合的数量。
如果交叉集合的数量与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 ]);
// → falsehttps://stackoverflow.com/questions/29416454
复制相似问题