Lodash _.有交集?

问题描述 投票:0回答:3

我想知道两个或多个数组是否有共同的项目,但我不关心这些项目是什么。我知道 lodash 有一个

_.intersection
方法,但我不需要它来遍历每个数组的每个项目。相反,我需要类似
_.hasIntersection
的方法,一旦找到第一个常见的情况,它将停止在数组中查找。 lodash有类似的东西吗?

javascript arrays lodash
3个回答
4
投票

您可以简单地使用

some
includes
:

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

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() 函数。这会产生一组布尔值,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

0
投票

死灵香草法师说

Array.some
Array.includes
都提前停止了。

const hasIntersection = (smArray, lgArray) => 
    smArray.some(needle => lgArray.includes(needle));
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.