javascript – Lodash _.hasIntersection?

我想知道两个或多个阵列是否有共同的项目,但我不在乎这些项目是什么.我知道lodash有一个_.intersection方法,但我不需要它来遍历每个数组的每一个项目.相反,我需要类似_.hasIntersection方法的东西,它会在找到第一个常见事件后停止查看数组.洛达什有类似的东西吗?

解决方法:

此方法可让您有效地搜索任意数量的数组中的交集.

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()函数以创建集合开始,这些是我们想要查找交叉值的集合,减去第一个集合.它返回值some(),它使用first()数组参数进行迭代,对some()的回调比较传递给函数的所有其他数组.

这是通过包装集合和构建调用链来完成的.它使用chain()来启用显式链接,因为我们希望在链的末尾链接isEqual()size().

我们将collections变量(一个数组数组)映射到includes()函数.这会产生一个布尔值数组,true表示其中一个集合中存在交叉值.下一步是使用compact()删除falsey值.我们剩下的是相交集合的数量.

如果相交集合的数量与集合的长度相同,我们发现了一个与所有集合相交的值,并且可以退出.这种方法很有效,因为有一些()和包括()的短路

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
上一篇:javascript – 如果过滤器函数是异步的,如何使用lodash过滤列表


下一篇:javascript – 递归地从“对象数组”中选择一个字段